Ruby Fibonacci示例 类斐波那契 def计算(n) 如果n> 102334155

Ruby Fibonacci示例 类斐波那契 def计算(n) 如果n> 102334155,ruby,Ruby,我正在努力理解这个节目。我知道如果calc方法不是0或1,它会递归调用calc方法两次,但我不知道它是如何为序列获取正确的数字的 我知道这是我的经验不足,但有人能解释一下这是如何正确计算fib序列的吗?它只是没有为我点击。让我们以n==3为例: 第一次迭代:n不是0或1,因此guard子句不为true。因此,我们将计算calc(2)+calc(1) 调用calc(2):我们调用calc(1)+calc(0)。这两个都满足guard子句,因此分别返回1和0。因此,此计算的结果是1 调用calc(1

我正在努力理解这个节目。我知道如果calc方法不是0或1,它会递归调用calc方法两次,但我不知道它是如何为序列获取正确的数字的


我知道这是我的经验不足,但有人能解释一下这是如何正确计算fib序列的吗?它只是没有为我点击。

让我们以
n==3
为例:

第一次迭代:
n
不是
0
1
,因此guard子句不为true。因此,我们将计算
calc(2)+calc(1)

调用
calc(2)
:我们调用
calc(1)+calc(0)
。这两个都满足guard子句,因此分别返回
1
0
。因此,此计算的结果是
1

调用
calc(1)
:触发guard子句并返回
1

现在我们将两个
1
s相加,得到正确的结果,
2


尝试对较高的
n
值应用相同的推理,并记住此实现是非常浪费的,因为它会重复计算相同的值。

当您无法理解代码在做什么时,您可能不得不使用
puts
语句对其进行附加。对于递归,改变缩进以显示方法何时调用自身以及何时返回也很有帮助。这里有一种方法可以用于代码

class Fibonacci
  def calc(n)
    return n if n < 2
    return calc(n - 1) + calc(n - 2)
  end
end

puts Fibonacci.new.calc(40)
>> 102334155
导致打印以下内容。我不会提供运行注释,当您阅读代码时,它应该是不言自明的

calc(4)

calc(4)
返回
3

你的问题不清楚。你能澄清一下吗?你知道什么是斐波那契数吗?你知道它(通常)是如何定义的吗?你明白这个定义吗?你知道如何用笔和纸手工计算斐波那契数吗?你试过了吗?你试过用笔和纸手工执行代码吗?哦,顺便说一句:“有人能给我解释一下这是如何正确计算斐波那契序列的吗?”——它不是在计算斐波那契序列,而是在计算斐波那契序列的第n个数。可能是
calc(4)
entered calc(4)
calling calc(3)
    entered calc(3)
    calling calc(2)
        entered calc(2)
        calling calc(1)
            entered calc(1)
            returning n=1
        calc(1) returned m1=1 to calc(2)
        calling calc(0)
            entered calc(0)
            returning n=0
        calc(0) returned m2=0 to calc(1)
        returning m1+m2=1
    calc(2) returned m1=1 to calc(3)
    calling calc(1)
        entered calc(1)
        returning n=1
    calc(1) returned m2=1 to calc(2)
    returning m1+m2=2
calc(3) returned m1=2 to calc(4)
calling calc(2)
    entered calc(2)
    calling calc(1)
        entered calc(1)
        returning n=1
    calc(1) returned m1=1 to calc(2)
    calling calc(0)
        entered calc(0)
        returning n=0
    calc(0) returned m2=0 to calc(1)
    returning m1+m2=1
calc(2) returned m2=1 to calc(3)
returning m1+m2=3