2013-12-09 87 views
0

1)我想我理解這第一個,因爲我注意到遞歸按從n到n-1的順序進行,並退出它所處的當前級別,直到它達到0並存在。我包含了一些put語句,用於映射並遵循遞歸。理解一個簡單遞歸邏輯的問題(Ruby)

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 < = 0「語句。根據我的理解,我的「B」和「。」 puts語句首先被評估,而我的「A」puts語句在「返回false語句」之後被評估。

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) 
+0

它看起來像第一個返回[4,3,2,1]和第二個副作用傳遞的數組,將1,2,3,4添加到它並返回false。那不是會發生什麼?發生反轉是因爲第二個函數在遞歸的途中改變了數組。 – danh

+0

感謝您的回覆。我覺得奇怪的是虛假陳述沒有出現在我的控制檯上。如果n <= 0並且整個函數看起來仍然以相同的方式工作,我可以取出false並將其作爲返回值。 – user3015876

+0

哦,是的,這是有道理的。我預測你是怎麼做的,但這是錯誤的。將在一個答案中解釋。 – danh

回答

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] 

錯誤是在堆棧上行結束時返回的。在返回堆棧的路上返回的第二個函數返回一個數組。

+0

啊這是有幫助的。該圖很有意義。 – user3015876

+0

很高興幫助。如果您認爲這是正確的,可以使用投票指標下的複選標記來標記它是否正確。 – danh