You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含赋值操作的return语句计算斐波那契数的原理探究

问题解答

一、含赋值操作的return语句工作机制与变量a的特性

1. 赋值操作的具体行为

先看目标代码:

let a = 0;
function foo (b) { 
  if (b === 20) return 1; 
  else return a = foo(b+1) + foo(b+1);
}

在JavaScript里,赋值表达式本身会返回赋值完成后的值。所以return a = 表达式的执行逻辑是:

  • 先计算右侧的foo(b+1) + foo(b+1),得到一个数值结果
  • 将这个结果赋值给全局变量a
  • 最后把这个结果作为foo函数的返回值返回

也就是说,这条return语句同时完成了「给a赋值」和「返回计算结果」两个动作。

2. 变量a的值为何都是2的倍数

从递归的终止条件倒推就能明白:

  • 当b=20时,函数返回1,这是递归的基础值
  • 当b=19时,foo(19)执行a = foo(20)+foo(20),也就是1+1=2,返回值和a的取值都是2
  • 当b=18时,foo(18)执行a = foo(19)+foo(19),也就是2+2=4,返回值和a的取值都是4
  • 以此类推,每一层递归的结果都是上一层结果的2倍,公式为foo(n) = 2 * foo(n+1)
  • 从b=20的1开始,每往前推一个b值,结果就乘以2,最终结果必然是2的幂次,自然都是2的倍数

比如foo(15):从20到15差5层,结果是2^5=32;foo(10)差10层,结果是2^10=1024,完全和给出的运行结果匹配。

二、带记忆化的斐波那契函数工作原理

这段代码是**记忆化递归(Memoization)**实现的斐波那契计算,核心是避免重复计算提升效率:

const fib = (n, dp) => {
  dp = dp || {};
  if (dp[n]) return dp[n];
  if (n === 1) return 1;
  if (n === 0) return 0;
  return dp[n] = fib(n - 1, dp) + fib(n - 2, dp);
};

拆解工作步骤:

  1. 初始化记忆容器:dp = dp || {},如果调用函数时没传入dp对象,就创建一个空对象,用来存储已经计算过的斐波那契值
  2. 复用已计算结果:if (dp[n]) return dp[n],如果dp里已经存了n对应的斐波那契值,直接返回这个值,不用再递归计算
  3. 定义基础终止条件:当n=0返回0,n=1返回1,这是斐波那契数列的定义基础
  4. 递归计算并存储结果:return dp[n] = fib(n - 1, dp) + fib(n - 2, dp),先递归计算n-1和n-2的斐波那契值,相加后把结果存入dp[n](写入记忆容器),同时将这个结果作为函数返回值返回

这种方式解决了普通递归斐波那契的重复计算问题——比如计算fib(5)时,普通递归会重复计算fib(3)多次,而记忆化递归只会计算一次fib(3)并存在dp里,后续直接取用,大幅提升了计算效率。


内容的提问来源于stack exchange,提问作者user2609980

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:41:03