簡體   English   中英

Java中的尾部遞歸優化和遞歸

[英]Tail recursion optimization and recursion in Java

我有一個關於尾部調用優化的問題,我需要知道此Java代碼的行為:

private void doSomething(int v) {

    inf f = someCalculation(v);

    if (f < 0) doSomething(v/2);
    else doSomething(v*2);

}

這段代碼是一個廢話示例,但在這種情況下,我的問題是:

  1. 第一個doSomething()調用會優化嗎?
  2. 第二個doSomething()調用會優化嗎?
  3. if / else塊是否以任何方式影響優化?

謝謝

編輯:

請提供一個示例,說明如果該語言不是Java,而是其他具有TCO的語言,將如何執行此操作

Java 8完全沒有尾調用優化。 沒有調用將被優化(變成迭代/ goto語句)。

但是,關於Java的TCO的討論由來已久,而Guy Steele是其最著名的支持者之一。

我建議從mlvm-dev郵件列表中閱讀此帖子 ,以mlvm-dev對該主題的最新評論。

嘗試運行以下代碼:

public static void main(String[] args) {
  for (int i = 1; i > 0; i *= 2) { doSomething(i); }
}

private static void doSomething(int start) {
  doSomething(start, start);
}

private static void doSomething(int i, int start) {
  if (i == 0) { System.out.println("done from " + start); }
  else { doSomething(i - 1, start); }
}

如果JVM可以在沒有堆棧溢出的情況下運行它,則意味着它可以進行尾部遞歸優化(或非常好的常數傳播)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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