2011-12-18 3 views
2

再帰関数について質問があります。ローカル変数でカウントする再帰関数

Iは整数で、個々の数字をカウントし、この小さなプログラム例を作った: 例:= 6 123 1 + 2 + 3 = 6

は、今私は、静的なint型でそれを作ったので、この再帰関数:

static int totalNumbers(int a) 
    { 
    if(a <= 0) 
     return sum; 
    else 
    { 
     sum += a % 10; 
     return totalNumbers(a/10); 
    } 
    } 

機能が魅力のように動作しますが、私の質問は、私は、静的なint型と呼ばれる合計せずにそれを作ることができますか? 関数内に整数の総和を定義し、それらをローカル変数でカウントできるようにする方法はありますか、それとも不可能ですか?

敬具、もちろん

答えて

6

:もちろん

static int totalNumbers(int a) 
    { 
    if(a <= 0) 
     return 0; 
    else 
    { 
     return (a % 10) + totalNumbers(a/10); 
    } 
    } 
+0

もしあなたが '戻る'ならばなぜ 'else'ですか? ;) – fge

+0

@fge私はちょうど最小の変更でOPからのコードを使用しました – yurib

+0

ありがとう:-)とてもシンプルですが、それを見ていませんでした。新しいものを学びました! – user1007522

4
static int totalNumbers(int a) 
{ 
    return a < 10 ? a : (a % 10) + totalNumbers(a/10); 
} 
1

することができます!静的なint型を使用することにより

public static int totalNumbers(int a) { 
    if (a == 0) 
     return 0; 
    return (a % 10) + totalNumbers(a/10); 
} 

あなたは、純粋な数学的な意味で機能を再帰関数のポイントを逃している属性、外部の値に依存しない、とあなたは毎回あなたと確信することができ同じ入力で呼び出すと、同じ出力が返されます。メソッドについては言えませんが、同じ入力で呼び出すたびに異なる結果が返されます。手動で外部のstatic int属性をゼロにリセットしない限りコール。

たとえば、次のように、行の実装2回以上呼び出してみてください。

System.out.println(totalNumbers(123)); 
System.out.println(totalNumbers(123)); 
System.out.println(totalNumbers(123)); 

は、私が何を意味するかを参照してください?もちろん

2

static int totalNumbers(int a, int sum) 
{ 
    if(a <= 0) 
    return sum; 
    else 
    { 
    return totalNumbers(a/10, sum + a % 10); 
    } 
} 

static int totalNumbers(int a) { 
    return totalNumbers(a, 0); 
} 

このバージョンでは、末尾再帰であるが、それはあなたにJavaで何かを与えることはありません。

1

確かに、静的な「合計」変数を持たない方が良いです。私はそういう形で書いています:

static int totalNumbers(int a) { 
    if (a <= 0) return 0; 

    return a%10 + totalNumbers(a/10); 
}