2012-02-08 22 views
2

私はこの基本的な再帰問題の多くをJavaで問題に抱えています。どのポインタも素晴らしいでしょう。基本的なJava再帰メソッド

" ジオメトリックシーケンスの第n項を印刷する静的再帰的な方法を記述してください:2,6,18,54"

コードのどこかで再帰的に何かを3倍する必要がありますが、これを行う方法を理解するのは苦労しています。私は終結声明が必要だと知っていますが、いつそれが起こりますか?ヘルパーメソッドが必要ですか?

答えて

7

Recursive Functionは、その実装が自身を参照する関数です。以下はいくつかの面白い例です。

public class Inception { 
    public void dream() { 
     boolean enoughDreaming = false; 
     //Some code logic below to check if it's high time to stop dreaming recursively 
     ... 
     ... 

     if(!enoughDreaming) { 
      dream(); //Dream inside a Dream 
     } 
    } 
} 

そして、あなたの問題の解決策:

public class GeometricSequence { 
    public static void main(String[] args) { 
     //Below method parameters - 5 = n, 1 = count (counter), res = result (Nth number in the GP. 
     System.out.println(findNthNumber(5, 1, 2)); 

    } 

    public static int findNthNumber(int n, int count, int res) { 
     return ((count == n)) ? res : findNthNumber(n, count+1, res *3); 
    } 
} 

EDIT

上記のクラスは、わずかな数字に適している、 "INT" を使用しています(整数オーバーフローの問題のため)。以下のクラスは、すべてのタイプ/番号について良好である:

public class GeometricSequence { 
    public static void main(String[] args) { 
     //Below method parameters - 5 = n, 1 = count (counter), res = result (Nth number in the GP. 
     System.out.println(findNthNumber(2000, 1, new BigInteger("2"))); 

    } 

    public static BigInteger findNthNumber(int n, int count, BigInteger res) { 
     return ((count == n)) ? res : findNthNumber(n, count+1, res.multiply(new BigInteger("3"))); 
    } 
} 
3

これは再帰の最も単純な例です。

メソッド宣言が必要です。

終了したかどうかを確認する必要があります。

それ以外の場合は、1つの単語と次の単語の間の違いをもたらす操作で再度メソッドを呼び出す必要があります。

1

はい、終了条件が必要です。基本的には、必要なだけ多くの手順を実行したときです。したがって、1つのコールから別のコールにどのように移行するかを検討してください。

  • これまでのところどのように結果を伝播しますか?
  • 必要なステップ数を把握するために必要な余分な状態は何ですか?
  • このメソッドから何を返すのですか?
1

ここで「カウンタ」は常になりますあなたが機能を実行するときですから、パラメータ

  • を入力します(私はあなたのJavaをやって知っているが、それはかなり似ています)

    public static void Recursive(int counter, int iterations, int value, int multiplier) 
        { 
         if (counter < iterations) 
         { 
          Console.WriteLine(value); 
          counter++; 
          Recursive(counter, iterations, (value * multiplier), multiplier); 
         } 
        } 
    

    C#の例です最初に電話をかけたときに0を返します

  • "反復"はnの値です
  • "value"はあなたの場合の開始値です2
  • 「乗数」は、あなたのケース3

それはカウンタが反復回数未満であるかどうかをチェックします実行されるたびに、各反復を掛けたいどのくらいです。それ以上の場合は、値が出力され、カウンタがインクリメントされ、値に乗数が乗算され、同じパラメータが関数に追加されます。

1

再帰溶液:配列(1)シーケンスの最初の要素である.... SEQ(n番目)

public static void main(String args[]) throws Exception { 
    int x = Seq(3); //x-> 18 
} 

public static int Seq(int n){ 
    return SeqRec(n); 
} 

private static int SeqRec(int n){ 
    if(n == 1) 
     return 2; 
    else return SeqRec(n - 1) * 3; 
} 

非再帰的解答:

public static int Non_RecSeq(int n){ 
    int res = 2; 

    for(int i = 1; i < n; i ++) 
     res *= 3; 

    return res; 
} 

public static void main(String args[]) throws Exception { 
    int x = Non_RecSeq(3); //x-> 18 
}