无法理解简单递归的逻辑(Ruby)

时间:2013-12-09 03:09:41

标签: ruby function recursion return

1)我想我理解了第一个,因为我注意到递归按顺序从n到n-1并退出当前的水平直到它到达0的基数并且存在。我将一些put语句放入映射并跟随递归。

def array_push(answer, n)                              #1. array push (RECURSIVE)
  puts "B n: #{n} inception map"; return answer if n <= 0;
  puts ". n: #{n} inception map"; answer << n; 
  puts "A n: #{n} inception map"; return array_push(answer, n-1)
end
puts array_push([], 4)

2)然而,当它向相反的方向发展时,这就是我迷失的地方......我很困惑为什么函数在它命中的时候没有返回false“如果n&lt;则返回false = 0“声明。根据我的理解,我的“B”和“。”首先评估puts语句,然后在“return false statement”之后评估我的“A”puts语句。

def reverse_push(answer, n)                          #2. reverse push (RECURSIVE)
  puts "B n: #{n} inception map"; return false if n <= 0 ## <== right here ##
  puts ". n: #{n} inception map"; reverse_push(answer, n-1)
  p answer
  puts "A n: #{n} inception map"; return answer << n
end
puts reverse_push([], 4)

1 个答案:

答案 0 :(得分:1)

你所看到的是有道理的。想想调用堆栈:

caller -> r([],4) -> r([],3) -> r([],2) -> r([],1) -> r([],0)
caller -> r([],4) -> r([],3) -> r([],2) -> r([],1) <- false
caller -> r([],4) -> r([],3) -> r([],2) <- [1]
caller -> r([],4) -> r([],3) <- [1,2]
caller -> r([],4) <- [1,2,3]
caller <- [1,2,3,4]

在堆栈结束时返回False。在返回堆栈的路上,第二个函数的返回返回一个数组。