递归函数需要有一个退出条件以防止它们永远运行。您的递归方法的主要部分如下:
seq = fib_seq(num - 1)
seq << seq[-2] + seq[-1]
在Ruby,方法的最后一个表达式被认为是该方法的返回值,所以上面的线是等同于:
seq = fib_seq(num - 1)
seq << seq[-2] + seq[-1]
return seq
让我们运行下来,如果该方法仅包含这两条线会发生什么,与NUM = 4:
call fib_seq(4)
call fib_seq(3)
call fib_seq(2)
call fib_seq(1)
call fib_seq(0)
call fib_seq(-1)
...
很明显,T他的结果无限循环,因为我们没有退出条件。我们总是在第一行再次拨打fib_seq
,因此代码在最后没有机会到达return
声明。为了解决这个问题,让我们在这两条线在开始添加:
array = [0, 1]
return array if num <= 2
这些可以被简化到只有:
return [0, 1] if num <= 2
现在,让我们看到,当我们调用该方法NUM发生了什么 = 4:
call fib_seq(4)
4 > 2, exit condition not triggered, calling fib_seq(n - 1)
call fib_seq(3)
3 > 2, exit condition not triggered, calling fib_seq(n - 1)
call fib_seq(2)
2 == 2, exit condition triggered, returning [0, 1]!
fib_seq(2) returned with seq = [0, 1]
add 0 + 1 together, push new value to seq
seq is now [0, 1, 1]
return seq
fib_seq(3) returned with seq = [0, 1, 1]
add 1 + 1 together, push new value to seq
seq is now [0, 1, 1, 2]
return seq
FINAL RESULT: [0, 1, 1, 2]
所以看起来这种方法工作是NUM值> = 2:
def fib_seq(num)
return [0, 1] if num <= 2
seq = fib_seq(num - 1)
seq << seq[-2] + seq[-1]
end
有一个错误左:NUM = 0和NUM = 1都返回[0, 1]
。让我们来解决这个问题:
def fib_seq(num)
return [] if num == 0
return [0] if num == 1
return [0, 1] if num == 2
seq = fib_seq(num - 1)
seq << seq[-2] + seq[-1]
end
清理了一点:
def fib_seq(num)
return [0, 1].first(num) if num <= 2
seq = fib_seq(num - 1)
seq << seq[-2] + seq[-1]
end
我看完这个写5个递归函数。这堆栈跟踪完全点击,帮我度过了几个问题,我之前没明白。现在到二进制搜索和合并排序! –