我非常肯定,我完全理解只有一個遞歸的方法是如何工作的。用一種方法進行雙遞歸Java
例)計算階乘
public int factorial(int n){ //factorial recursion
if(n==0){
return 1;
}
else{
return n*factorial(n-1);
}
}
對於這些方法,我甚至能想象這是怎麼回事了堆棧中,並在每個堆棧層正在返回什麼值。
但是每當我遇到雙遞歸的方法時,夢魘就開始了。
下面是一個遞歸問題,從編碼蝙蝠雙遞歸。鑑於整數數組
實施例),是有可能選擇一個組的一些整數的,使得該組總和爲給定的目標?如果是,則爲真。如果否,則爲false。 您使用3個參數;起始索引開始,int數組NUMS,目標int值目標。
下面是解決這個問題的方法。
public boolean groupSum(int start, int[] nums, int target) {
if (start >= nums.length) return (target == 0);
if (groupSum(start + 1, nums, target - nums[start])) return true;
if (groupSum(start + 1, nums, target)) return true;
return false;
}
我想了解這個解決方案是這樣的。假設我給了一個數組{2,4,8},起始索引= 0,目標值爲10.因此,(0,{2,4,8},10)通過該方法進入,函數獲取在
if (groupSum(start + 1, nums, target - nums[start])) return true;
-called所以它成爲(1,{2,4,8},8)
直到開始索引命中
它一遍又一遍。當它打到3時。最後一級(?)的棧進入第二次遞歸調用。這就是我開始失去正在發生的事情的地方。
誰能打破這對我?當人們使用雙遞歸(我知道這是非常低效的,並且在實踐中,幾乎沒有人使用它來降低效率,但僅僅是試圖理解它),他們是否真的可以想象會發生什麼?還是他們只是用它希望基本情況和遞歸能正常工作?我想,這一般適用於誰寫的歸併排序,河內alogrithm等塔的所有脂肪酶..
任何幫助是極大的讚賞..
你在這裏發明術語。它不是沒有「雙遞歸」 - 你已經顯示的是一個普通的遞歸。而且,就像一個有智慧的人曾經說過的,「爲了理解遞歸,你必須首先理解遞歸」。 – vaxquis
以及我想我還沒有理解遞歸。所以請賜教。 – Hello
成爲我的客人:http:// stackoverflow。com/questions/3021/what-is-recursion-and-when-should-i-use-it https://en.wikipedia.org/wiki/Recursion http://stackoverflow.com/questions/126756/examples-遞歸函數 – vaxquis