使用For Loop实现斐波那契数列:为何range()中需用n-1?
为什么这段斐波那契代码里要用
range(n-1)? 先明确这段代码的斐波那契数定义:
- 第0个斐波那契数是0(调用
fib_linear(0)返回0) - 第1个斐波那契数是1(调用
fib_linear(1)返回1) - 第2个及以后的数,等于前两个数的和
再看代码的初始状态:previousFib = 0(对应第0个斐波那契数),currentFib = 1(对应第1个斐波那契数)——这时候我们已经拿到了第1个目标数。
接下来要得到第n个斐波那契数,需要从当前的第1个数开始,一步步往后推导:
- 要得到第2个斐波那契数:只需要计算1次(0+1),对应循环1次,也就是
range(1),而n=2时n-1=1 - 要得到第3个斐波那契数:需要计算2次(先得到第2个数1,再得到第3个数1+1=2),对应循环2次,也就是
range(2),n=3时n-1=2 - 以此类推,要得到第n个斐波那契数,总共需要从第1个数往后迭代
n-1次——因为初始已经站在第1个数的位置,每循环一次就往后推进一个数,循环n-1次后,currentFib就会变成第n个斐波那契数
举个具体例子验证:
当n=4时,range(4-1)=range(3),循环执行3次:
- 第一次循环:
newFib = 0 + 1 = 1→previousFib = 1,currentFib = 1(此时currentFib是第2个斐波那契数) - 第二次循环:
newFib = 1 + 1 = 2→previousFib = 1,currentFib = 2(此时currentFib是第3个斐波那契数) - 第三次循环:
newFib = 1 + 2 = 3→previousFib = 2,currentFib = 3(此时currentFib是第4个斐波那契数)
循环结束后返回3,正好是预期的第4个斐波那契数。
总结一下:初始状态已经持有第1个斐波那契数,要拿到第n个,需要额外迭代n-1次,所以用range(n-1)来控制循环的次数。
内容的提问来源于stack exchange,提问作者meowmeow
相关产品推荐
相关产品推荐

