记得小时候刚学数字次方的时候,老师会说:10^3表示3个10相乘等于1000,10^2表示2个10相乘等于100,然后问到10^0的时候,老师似乎没有给予更多的解释——书上是这么定义的。其实按照老师的思维来想,10^0不就是0个10相乘吗?那答案应该是0才对啊,怎么会是1呢?那10^(-1)呢?-1个10相乘?额……小学没想这么多,也没心思去纠结这些问题。
我不是质疑老师的答案有问题,而是在想,这种思维来定义M^N,到底对不对,我说的对不对是指能不能对所有的情况进行合理地解释,就比如0的阶乘为什么是1,这个按照2!=1*2来解释也解释不通,或许,这根本就是无法解释的,因为这些不是自然本身存在的真理,定理,而是人为发明出来方便人类解决问题的数学定义,所以,发明次方,发明阶乘的人一开始是怎么定义就怎么定义,方便就好。那我说里面不存在逻辑证明,好像也不对,数学证明都是有逻辑的,而不是有感而发写篇文章这么简单。
幸好,我在一本书里面找到了一个比较好的思维方法,这本书叫《程序员的数学》,是由日本程序员——结城浩著的。里面这样来解释M^N,就是10^2是10^3的1/10,这样,10^0是10^1的1/10,显然,10^0 = 1,进而,10^(-1)
= 1/10。这样的思维来解释就明了多了。
所以,我想说,纠结一个数学问题或者程序问题,不是无聊,而是逼着自己去思考,这种思考不一定真能解决你当前的问题,但它一定会给你带来其他好处,比如,绕开思维定势,寻找一种新的思维!有时候遇到很难问题的时候,不一定是自己在这个思维上的能力有问题,而是,这个思维对吗?你确定这种思维模式能一直走下去吗?何不换个思维,有可能问题就迎刃而解!
比如,下面这道趣味编程题目:
using namespace std; int main() { //填空,让程序运行时输出helllo world,注意,只能填if里面哦~其他代码不能变 if(代码只能填在这里) cout<<"hello"; else cout<<" world"<
我给我一个同学做的时候,他看了看说:代码这么少?我看看啊……看来,他觉得很简单!于是,他开始想了,使用什么逻辑,能让第一个语句输出(hello),又能让第二个语句输出(world)呢?(他自言自语),我暗喜着:你这样想下去是没有结果的!为什么,因为一开始思维就错了!看程序也知道,如果第一句输出语句真的执行了,那第二条是不会执行的,因为是if……else……语句!果真,他想了好一会儿,也尝试了很多逻辑运算,还是没能解决出来!他可能有点心急了,其实我也理解,再难的数据结构算法都能编写得心应手,面对看似这么简单的题目却做不出来……我就说:你换个思维试试,两条语句无法同时执行的……他想了想,很快就出来了,在if()里面填上cout<<"hello"&&0即可以了,所以说,做不出来不是自己真的很笨,没必要气馁,或许是想错了呢?其实这道题考的就是思维问题,看你怎么来想,想不出的时候能不能换一个思维?结果是要输出:hello world,而不是要执行原有代码的输出语句来输出:hello world ,这是两种思维!所以,当解决不了当前的难题的时候,放松放松,换个角度思考一下!
最后建议大家去看一下这本书《程序员的数学》洁城浩著。如果你喜欢数学,喜欢编程,会更喜欢的!!