2014-02-24 91 views
0

所以我玩了這個,最終使它工作。我有一個問題,爲什麼我需要一個「返回」數組6(nums,index + 1);而不是僅僅使它成爲遞歸調用array6(nums,index +1)。在數組中尋找6的遞歸

public boolean array6(int[] nums, int index) { 
boolean contains = false; 
    if(nums.length == 0) 
    { 
    contains = false; 
    } else { 
    if(nums[index] == 6) 
    { 
     contains = true; 
    } else { 
     if(index + 1 == nums.length) 
     { 
     contains = false; 
     } else { 
     return array6(nums, index + 1); 
     } 
    } 
    } 
    return contains; 
} 
+1

回報array6 ......正在遞歸調用array6()並返回一個調用的結果。如果這沒有意義,請參閱是否可以找到一些遞歸實現的階乘,以便圍繞它可以圍繞您的大腦。 – jbruni

回答

0

這是關於recursion的一個非常基本的問題。

一個簡單的解釋: 想象一下,在每一個遞歸調用你分支出來,在最後,當你完成你的工作,你想返回到每一個分支您在支路還得到了結果。

0

你不需要return array6 - 但是你確實需要以某種方式發回你遞歸發現的方法。你可以通過返回來做到這一點,就像在你的代碼中一樣,或者通過`contains = array6(nums,index + 1);

否則,即使您的遞歸調用之一找到一個匹配,您仍然會在第一次返回true後返回false鏈。

0

讓我們假設你不使用的回報,你的代碼應該是這樣的:

} else { 
     array6(nums, index + 1); 
} 

如果要array6的調用不找到6?你不會知道,因爲答案是無論array6返回什麼,所以你要麼將它存儲在另一個變量中(如contains並稍後返回),要麼使用return語句直接返回它。

0

因此,每個函數調用時,它會在堆棧上分配一點。每次遞歸調用,它都會創建一個指向堆棧上下一個函數調用的鏈接。

注意:以下內容並不完全準確,因爲我簡化了很多後端工作。

所以到步驟出來, 樣本陣列{2,2,6} [呼叫#,返回]

首先呼叫,我們開始在索引0

[1, - 返回新呼叫 - ] // 6號的是,調用中間方式

[1,[2, - 返回新呼叫 - ]在] //沒有6還

[1,[2,[3,-finds 6索引'2'並返回 - ]]]

[1,[2, - 第三呼叫返回 'true']]

[1,-2nd呼叫返回 'true']

回答是正確的。

而且,這個問題更短的方式:

public boolean array6(int[] nums, int index) { 
    if(index < 0 || index > nums.length){ // index is out of bounds or not found 
     return false; 
    } else if(nums[index] == 6){ 
     return true; // If we see it, return true. 
    } else { 
     return array6(nums , index + 1); 
    } 
}