[问题] 用loop写出费柏纳契数列问题

楼主: d13751200344 (callmedan)   2022-03-07 17:36:23
各位前辈好,小弟这两天试着利用loop去写出费柏纳契数列function (0,1,1,2,3,5,8,…),写出了如下代码:
function fib(n) {
let arr = [0, 1];
for (let i = 2; arr.length >= n; i++) {
arr.push(arr[i-1]+arr[i-2]);
}
return arr;
}
console.log(fib(4));
结果应该是[ 0, 1, 1, 2, 3 ],但输出的结果却是错误的[ 0, 1 ],我手动算了很多次觉得应该要是对的,但不知道为什么是错的?
后来我发现,只要把for loop条件“arr.length<=n”答案就会是正确的;但我验算结果确是arr.length>=n才合理?
(由“预想的”结果反推,当fib(4)时,arr=[0,1,1,2,3],arr.length=5,所以理应是n<=arr.length才对呀?)
作者: laechan (挥泪斩马云)   2022-03-07 18:01:00
一般不是直觉用 for(i=2;i<=n;i++) 吗? 再看n多少
作者: oToToT (屁孩)   2022-03-07 18:01:00
你想一下你跑第一个循环的时候arr.length是多少
作者: laechan (挥泪斩马云)   2022-03-07 18:02:00
你要debug就在循环内console.log(i+" "+arr.length);
作者: oToToT (屁孩)   2022-03-07 18:04:00
根本部会进去循环的话,加了console.log可能也看不出来吧*不会
作者: LPH66 (-6.2598534e+18f)   2022-03-07 20:14:00
for 循环的条件是“成立时执行循环”当成跟 while 循环一样就是了
楼主: d13751200344 (callmedan)   2022-03-08 09:56:00
但我实在不懂为何我写arr.length>=n 时condition 会是false?我写了开始条件: i=2 ; 结束条件arr.length>=n,因为n=4,而arr.length是2 (arr=[0, 1, 1]) ;而由“预想的”结果反推,当fib(4)时,arr=[0,1,1,2,3],arr.length=5,所以理应是arr.length>=n才对呀?
作者: Kenqr (function(){})()   2022-03-08 15:41:00
相反了 for循环中间的是执行条件 不是结束条件每次进循环前检查 是true的话才会执行第一次检查时,arr.length是2,n是42>=4不成立,所以循环连一次都不会执行
作者: laechan (挥泪斩马云)   2022-03-16 13:52:00
在循环内加console.log,执行时不显示,一样能debug是循环出问题--就是循环连一次都没执行这例子就是 ;arr.length >= n; 除非n<=2, 不然都不会执行所以结论就是你写反了,用 ;arr.length<n; 去跑看看

Links booklink

Contact Us: admin [ a t ] ucptt.com