如果is_fibonacci? 有两个值10 和144,您可以检查调用跟踪。它显然是在计算小于或等于给定值的斐波那契数,然后在递归中进行比较。
is_fibonacci?(10, current = 1, before = 0)
is_fibonacci?(10, current = 1, before = 1)
is_fibonacci?(10, current = 2, before = 1)
is_fibonacci?(10, current = 3, before = 2)
is_fibonacci?(10, current = 5, before = 3)
is_fibonacci?(10, current = 8, before = 5)
is_fibonacci?(10, current = 13, before = 8)
is_fibonacci?(144, current = 1, before = 0)
is_fibonacci?(144, current = 1, before = 1)
is_fibonacci?(144, current = 2, before = 1)
is_fibonacci?(144, current = 3, before = 2)
is_fibonacci?(144, current = 5, before = 3)
is_fibonacci?(144, current = 8, before = 5)
is_fibonacci?(144, current = 13, before = 8)
is_fibonacci?(144, current = 21, before = 13)
is_fibonacci?(144, current = 34, before = 21)
is_fibonacci?(144, current = 55, before = 34)
is_fibonacci?(144, current = 89, before = 55)
is_fibonacci?(144, current = 144, before = 89)
10 : false , 144 : true
这是为前 10 个斐波那契数提供此输出的代码:
def fib(n)
if n <= 0 then 1
else
fib(n-1) + fib(n - 2)
end
end
def is_fibonacci?(i, current = 1, before = 0, level=0)
puts (" " * level) + " is_fibonacci?(#{i}, current = #{current}, before = #{before})"
if current == i || i == 0 then
return true
elsif current > i then
return false
else
is_fibonacci?(i, current + before, current, level+1)
end
end
(0..10).each do |i|
n = fib(i)
ifib =is_fibonacci?(i)
nfib = is_fibonacci?(n)
puts "#{i} : #{ifib} , #{n} : #{nfib}"
end