簡體   English   中英

Java中的尾部/前向遞歸

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM