2016-06-28 10 views
0
public class a1 { 

    private static int unit = 0; 

    private static int sum = 0; 

    public static void main(String[] foo) { 
     unit = 10; 
     System.out.println(tailRecur(unit)); 

     System.out.println(tailRecur2(10)); 
    } 

    public static int tailRecur(int result) { 
     int sum = result + unit - 1; 
     unit = unit - 1; 
     if (unit == 0) { 
      return sum; 
     } 
     return tailRecur(sum); 
    } 

    public static int tailRecur2(int unit) { 
     if (unit == 0) return sum; 
     sum = sum + unit; 
     return tailRecur2(unit - 1); 
    } 
} 

私は1 + ... + 10を達成するための簡単な方法を書いています。どの文が再帰構文の意味をよくするかはわかりません。すべてが私に正しい答えを与える。Javaでの再帰、どちらが最善でしょうか?

+0

機能は、それが再帰の定義だけだ、自分自身を呼び出すので、これは意見がベースとしているようで、私はどちらもしていないことを言うだろう疑問 –

+6

正しい。静的フィールドを使用してはいけません。 – Andreas

+0

また、どちらもJavaで実現可能な実装ではありません。十分な大きさの 'unit'値の場合、StackOverflowErrorを取得します。 (しかし、おそらく "レッスン#2"です) –

答えて

3

静的変数を格納する必要はないため、いずれのソリューションも理想的ではありません。何をしようとするこの

  1. のように考えて

    みては?回答:1+...+N

  2. 入力とは何ですか?答え:N、合計する最高の数値です。

  3. 各ステップで何ができるのですか?その入力で回答に達するのに役立ちますか?答え:その番号を取り出し、すべてのN - 1ソリューションの結果に追加します。

  4. いつ再帰を停止し、集計結果を蓄積する必要がありますか(ベースケースは何ですか)?答え:数値が1(一般的には可能な限り小さい入力)に達したとき、または負の数の入力がStackOverflowエラーを起こさないようにするために数値よりも小さいとき。

public static int sumUpTo(int x) { if (x <= 1) return x; return x + sumUpTo(x - 1); }

+0

最初の行は 'if(x == 1)return x;'にすることができます。 – shmosel

+1

@shmoselこれは 'sumUpTo(0)'の呼び出しをサポートしません。確かに、どちらの方法でも負の値を扱うことはできませんが、単純な '<'が空の '0'パラメータをサポートするならば、それは正しい方法だと思います。 – Andreas

関連する問題