关于JavaScript中||赋值逻辑及斐波那契递归终止的技术疑问
关于斐波那契记忆化递归实现的两个疑问解答
第一个疑问:storage = storage || {} 的作用
你的理解完全正确。JavaScript中||逻辑或运算符的规则是:若左侧值为真值(比如非空对象、非零数字等),则返回左侧值;若左侧为假值(比如undefined、null等),则返回右侧值。
- 首次调用
fib时,未传入storage参数,该参数默认是undefined(假值),因此会执行storage = {},创建一个空对象作为缓存容器。 - 后续递归调用时,传入的
storage是已存在的对象(真值),所以直接复用该对象,保证所有递归分支共享同一个缓存,实现记忆化的核心效果。
第二个疑问:为什么递归会在0处停止,不会进入负数?
代码中的终止条件if (number <= 1) { return 1; }已经覆盖了number=0的场景:当递归到number=0时,满足0 <= 1的判断,直接返回1,不会继续调用fib(-1, storage)和fib(-2, storage),自然不会陷入负数的无限递归。
举个实际执行的例子,计算fib(2)时:
- 调用
fib(2, {}),不满足缓存和终止条件,执行fib(1, {}) + fib(0, {}) fib(1, {})触发number <=1,返回1fib(0, {})同样触发number <=1,返回1- 最终
fib(2)得到1+1=2,递归到此结束,不会产生负数参数的调用
内容的提问来源于stack exchange,提问作者Primitive
相关产品推荐
相关产品推荐

