2012-10-06 26 views
-5

是否有可能計算沒有變量的遞歸深度?統計遞歸調用無變量

+0

你是什麼意思「遞歸調用次數」? – arshajii

+0

使遞歸方法返回語句本身是遞歸計數 – gtgaxiola

+2

如何計算某些內容而不實際計算?您將需要一個變量來存儲計數。 –

回答

1

你在找這樣的嗎?

public int foo(int count) { 
    if (exitCondition) return count; 
    foo(count+1); 
} 

計數調用的其他方法包括反射或使用字節碼修改庫(即AoP)。

在Java
+2

這不是使用變量嗎? – arshajii

+0

它純粹是功能性的,我想這個問題在具體細節上有點模糊。 –

+0

@ A.R.S取決於您是否將方法參數計數爲「變量」。 – Fildor

1

Thread.currentThread().getStackTrace() 

可以用於確定呼叫的深度。遞歸調用的數量是堆棧長度和第一幀的位置之間的差異。

或拋出異常,然後從最頂層的功能與檢索堆棧:

Throwable.getStackTrace() 

返回堆棧跟蹤元件的陣列,每個代表一個堆棧幀。數組的第零個元素(假定數組的長度不爲零)表示堆棧的頂部,這是序列中最後一個方法調用。通常,這是創建和拋出此throwable的關鍵點。數組的最後一個元素(假設數組的長度不爲零)代表堆棧的底部,這是序列中第一個方法調用。

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html

0

你提的問題是非常模糊的,所以我做了幾個假設:

  1. 通過你的意思是「遞歸深度」
  2. 「遞歸調用數」該函數的原始調用者想知道深度,所以遞歸方法返回它
  3. 「無變量」,這意味着你甚至不能使用局部變量來跟蹤部門^ h

所以,如果你在一些隨機的方法和你打電話給你的遞歸函數:

public void randomMethod() { 
    Something somethingToRecurseOn = ... ; 
    int depth = recurse(somethingToRecurseOn); 
} 

這是我的解決方案的預期使用。這裏的recurse方法:

public int recurse(Something s) { 
    Something subS = s.getSubS(); 
    if (subS == null) { // Exit condition 
     return 1; 
    } 
    // Do something with subS 
    return recurse(subS) + 1; 
} 

您深度融入你的函數的返回值,取1的深度爲你的退出條件。

這是一個面試問題,我過去問,你必須返回一個遞推數列元素的數量實際上是相關的,簽名是:

public int collatz(int n) 

哪裏n是你要操作的數字來找到序列的下一個數字,它停在1處。如果它是用遞歸而不是迭代實現的,它實質上返回遞歸深度。