请求解析Ruby中递归实现Fibonacci数列代码的分步工作原理
分步解析Ruby递归实现斐波那契数列的执行逻辑
没问题!我来一步步拆解这段递归斐波那契代码的执行过程,咱们就盯着fibonacci(6)这个调用慢慢捋清楚~
首先先明确这段代码的核心逻辑:
def fibonacci(n) n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2) end
这是三元表达式的写法,翻译成大白话就是:
- 如果传入的
n是0或者1,直接返回n(因为斐波那契数列的前两项定义就是fib(0)=0、fib(1)=1) - 否则,返回
fib(n-1)和fib(n-2)的和——而这两个值又需要再次调用fibonacci函数来计算,这就是递归的核心:函数自己调用自己来拆解问题。
接下来咱们一步步追踪fibonacci(6)的执行流程:
- 初始调用
fibonacci(6):因为6>1,所以需要计算fibonacci(5) + fibonacci(4),现在得先算出这两个子调用的结果 - 先处理
fibonacci(5):5>1,分解为fibonacci(4) + fibonacci(3),继续拆解 - 处理这个
fibonacci(4):4>1,分解为fibonacci(3) + fibonacci(2) - 处理这个
fibonacci(3):3>1,分解为fibonacci(2) + fibonacci(1) - 处理这个
fibonacci(2):2>1,分解为fibonacci(1) + fibonacci(0) - 终于到了递归的「终止条件」:
fibonacci(1):1<=1,直接返回1fibonacci(0):0<=1,直接返回0
所以fibonacci(2)的结果是 1+0 = 1
- 回到
fibonacci(3):现在有了fibonacci(2)=1和fibonacci(1)=1,结果是1+1 = 2 - 回到
fibonacci(4):现在有fibonacci(3)=2,接下来要算另一个子调用fibonacci(2)(这里注意,递归会重复计算已经算过的值),fibonacci(2)还是返回1,所以`fibonacci(4)=2+1 = 3 - 回到
fibonacci(5):现在有fibonacci(4)=3,接下来算fibonacci(3)(同样是重复计算),结果是2,所以`fibonacci(5)=3+2 = 5 - 回到最初的
fibonacci(6):已经算出fibonacci(5)=5,接下来要算fibonacci(4)(再次重复计算),结果是3,所以`fibonacci(6)=5+3 = 8 - 最后
puts fibonacci(6)把结果8输出到控制台
小补充:这种朴素递归虽然容易理解,但有个明显的缺点——大量重复计算(比如fibonacci(2)、fibonacci(3)被调用了好几次),如果n很大的话效率会很低。如果要优化,可以用记忆化(把已经计算过的结果存起来)或者迭代的方式实现~
内容的提问来源于stack exchange,提问作者mitjay98
相关产品推荐
相关产品推荐

