[英]Tail/forward recursion in Java
我不明白為什么這是前向遞歸:
int count(int x) {
if(x<=0) return 0;
return 1 + count(x - 1);
}
這是一個關於練習考試的問題,答案是它的前向遞歸。 為什么會這樣? 我怎么能區分這兩者?
在給自己打電話之后,你正在做一個補充。 尾遞歸意味着絕對沒有什么可以追隨
如果您了解實施,那么很明顯為什么。
假設我們第一次從main
調用count
,這是在程序計數器 0xAAA
。 然后它完成了大部分方法。 我們將說這個堆棧幀的遞歸調用計數為0xBBB
。 如果您正在使用尾遞歸,則在調用自身時,它可以將返回地址設置為0xAAA
(直接轉到調用我的代碼)。 如果之后正在執行任何操作 ,則必須將返回地址設置為0xBBC
(添加的地址)。 因為它不需要堆棧幀來存儲返回地址,所以將遞歸轉換為迭代也更容易。 當count
調用自身時,它可以跳轉到方法的開頭。
解決方案(對於簡單的例子)是在另一個參數中建立結果:
int count(int x, int res) {
if(x<=0) return res;
return count(x - 1, res + 1);
}
注意我們之后什么都不做。
您是否看過這個問題,尾部與前向遞歸 ?
馬修有答案,長篇大論就是:
int count(int x) {
if(x<=0) return 0;
return 1 + count(x - 1);
}
可以寫成(並擴展為類似):
int count(int x) {
if(x<=0) return 0;
int tmp_result = count(x - 1);
return 1 + tmp_result; // e.g. recursion is not last
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.