如何用轻小说的方式学C (五) 斐波那契与他的小兔子们(4)
} //进位
}
int i;
for(i=maxLen-1;i>0;--i) {
if(ia[i]!=0) break; //break的意思是跳出这一层循环
}
for(;i>=0;--i) {
std::cout<<ia[i];
}
return 0;
}
“作为今天的第一个作业,思考一下输出的时候为什么要这两个循环吧~”
“诶?!”
“那么进入今天的第二个部分——递归!”
“递归?好像数学课里面有听到过,唔...”
“递归就是说一个函数自己调用自己~”
“诶那不会一直调用下去吗?!”
“所以有个东西叫递归出口啊~”
“诶?”
“比如斐波那契数列求第n项可以这么写:”
int fib(int n) {
if(n==1 || n==2) return 1;
else return fib(n-1) fib(n-2);
}
“可以看到,fib这里自己调用了自己两次,然后把值加起来返回。正可谓数学里面的A[n]=A[n-1] A[n-2]”
(似懂非懂)
“那个...凛音酱啊,这里这么多n...不会互相覆盖吗?”
“你还记得我之前说的实际参数与形式参数吗?”
“忘了。”
“就是说,这些东西里面互相不干扰,会进行替换的。这里的参数n只是一个标记,当你运行fib(n-1)的时候,相当于新开了一个副本,又有一个新的n,我们姑且记作n'吧,它的值是n-1。然后在n'的里面,又有fib(n'-1),记作n",以此类推。”
“好厉害啊!那就是说会有很多个n喽?”
“的确。”
“好我们来算一下fib(10000)吧!”
Segmentation fault (core dumped)
“诶?!出错了?!”
“这也引出另一个话题。正是因为计算机要给这些n存位置,包括你新调用一次fib就会多一些数据,当这些数据太大了以后就会炸掉。所以——尽量避免递归。”
(虽然不懂但还是点点头吧)
“但是递归的确是一个解决的思路。并且——递归与循环等价。”
“等价?”
“那么今天的第二个作业~禁止使用for do-for while以及goto,实现1到100的求和。”
“诶?!”
【久远的小课堂】
图片来自某三次元傻屌同学。从命名上可以看出有多严重的心理问题
[注意: 不是所有的编译器都支持宽字符标识符的,写代码请还是好好用字母]
这一次我就对刹那不知从哪里搞来的代码进行剖析。