ローカルvarで数える再帰関数

私は再帰関数について質問しています。

私はこの小さなサンプルプログラムを作って、整数の個数を数えます: 例:1 + 2 + 3 = 6であるため、123 = 6。

今私は静的なintとこの再帰関数で作った:

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

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

敬具、

2

5 答え

もちろん:

static int totalNumbers(int a)
  { 
    if(a <= 0)
      return 0;
    else
    {
      return (a % 10) + totalNumbers(a/10);
    }
  }
6
追加された
ありがとう:-)それほどシンプルだけど見たことはありませんでした。新しいものを学びました!
追加された 著者 user1007522,
return の場合、 else はなぜですか? ;)
追加された 著者 fge,
@fge私はちょうど最小限の変更でOPからのコードを使用した
追加された 著者 yurib,
static int totalNumbers(int a)
{
    return a < 10 ? a : (a % 10) + totalNumbers(a/10);
}
4
追加された

もちろん:

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);
}

このバージョンはtail-recursiveですが、Javaでは何も表示されません。

2
追加された

もちろんできます!

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

静的なint属性を使用することで、最も純粋な数学的意味での関数は外部値に依存しない再帰関数のポイントがなくなり、いつでも呼び出すたびに同じ入力を使用して同じ出力を返します。これは、メソッド間の相互間で外部静的int属性をゼロに手動でリセットしない限り、同じ入力で呼び出すたびに異なる結果を返すメソッドについては言えません。

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

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

私の言いたいことを見て?

1
追加された

確かに、静的な "sum"変数を持たない方が良いです。私はそのような方法でそれを書いています:

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

    return a%10 + totalNumbers(a/10);
 }
1
追加された