2016-02-28 652 views
0

所以我知道如何使用具有非void一些其他的返回類型的遞歸方法。通常我會在同一個方法中再次調用相同的方法(在遞歸情況下),同時在調用中減少或增加一些值以達到基本情況。然後在某個時刻到達基本案例並解決問題,因此它開始返回每次調用的值。沿着這些線。如何使用在java中具有返回類型void的遞歸方法?


如果什麼方法返回void類型,所以你不能叫,因爲它不會/不能返回什麼方法?我試圖向後寫一句,我已經有一個for循環,並且可以返回一個字符串值resucrive方法解決了這兩個,但我不知道如何,如果它是無效接近它這是任務是什麼要求。
編輯:我還要提一句,只能通過參數

謝謝大家的信息和幫助!

+0

使用類級對象來保存遞歸數據。不好的做法,因爲它很難跟蹤遞歸問題/因爲你的對象總是在變化,所以實際上很難實現遞歸。主要用於簡單情況下,只和總和/連接一樣。 –

回答

1

遞歸不與方法/返回值的功能才能正常工作。遞歸只意味着方法/函數自己調用。

你必須保證至少有一個停止條件,但並不要求函數返回一個值。這通常是通過遞增地改變每次函數遞歸調用時通過的一個或多個參數來實現的。當那些/那些參數滿足某個條件時,你的函數不再調用它自己,並且所有待處理的操作都被解決了。

我不完全瞭解你正在嘗試做的,但這裏的任務是向後將一個字符串遞歸函數的一個例子。我使用希望不言自明的名稱使用PSEUDO函數。

public void writeBackwards(String str) { 
    // This is the negation of the stop condition, so the stop condition 
    // is when the string is empty, in which case this function will do 
    // nothing: 
    if (!str.isEmpty()) { 
     char firstCharacter = str.getFirstCharacter(); 
     str = str.removeFirstCharacter(); 
     writeBackwards(str); // the recursive call 
     // The following operation will be pending, waiting for the 
     // recursive call to be resolved first: 
     writeCharacter(firstCharacter); 
    } 
} 
+0

謝謝。我想我非常關注它需要實際返回的東西。我最終使用變量作爲角色的空間持有者。它會將該字符從最後一個位置一直打印到開頭,直到達到字符位置0的基本情況。所以變量將是最後一個字符,打印該變量,然後再次調用該函數減1個位置。我看了以前的例子,看起來很複雜,但這非常簡單。 – pudge

0

可以使用可變對象爲遞歸函數存儲結果的參數。例如,你所提到的向後句子問題可以寫成:

public void stringReverse(String s, int index, StringBuilder sb) { 
    if (index < 0) 
     return; 
    sb.append(s.charAt(index)); 
    stringReverse(s, index - 1, sb); 
} 

而且這樣調用

StringBuilder sb = new StringBuilder(); 
stringReverse(mySentence, mySentence.length() - 1, sb); 
0

就像在C++中,你可以在指針傳遞,這裏在Java中,你可以簡單地傳遞在函數的類對象中保存從函數的遞歸調用生成的值。反映你的問題來計算斐波納契數的一個簡單例子如下。

public class ComputeFibonacci { 
    static class Fibonacci { 
    public int ith; 
    public int value; 
    Fibonacci(int a, int b) { 
     ith = a; 
     value = b; 
    } 
    } 

    private static void fibonacci(Fibonacci result) { 
    if (result.ith == 1 || result.ith == 2) { 
     result.value = 1; 
    } else { 
     Fibonacci left = new Fibonacci(result.ith - 1, 0); 
     Fibonacci right = new Fibonacci(result.ith - 2, 0); 
     fibonacci(left); 
     fibonacci(right); 
     result.value = left.value + right.value; 
    } 
    } 

    public static void main(String[] args) { 
    // Here we compute the 10th fibonacci number 
    Fibonacci f = new Fibonacci(10, 0); 
    fibonacci(f); 
    System.out.println("The result is " + f.value); 
    } 
} 

祝你好運。