2

再帰を使用して整数の桁数を取得することになっている関数を書いています。たとえば、236は3桁です。私はこれまでこれを持っていますが、機能していません。また、そこに再帰の本当に良い説明がありますか?

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
          Console.WriteLine(getDigits(5428, 0));
          Console.ReadLine();
        }

        public static int getDigits(int digits, int i)
        {
            if (digits != 0)
            {
                i++;
                getDigits(digits/10, i);                
            }

            return i;
        }
    }
}
4

3 に答える 3

5

さて、再帰関数を少し調整する必要があります。

public static int GetDigits(int number, int digits)
{
    if (number == 0)
        return digits;

    return GetDigits(number / 10, ++digits);
}

あなたの間違いは、再帰呼び出しから結果を返さないということです。

于 2012-09-21T11:07:53.220 に答える
0

を返していますがi、関数が再帰から戻ると、 の値iは 1 で、1 を返します。

代わりに、再帰の結果を返す必要があります。

return getDigits(...)

public static int getDigits(int digits, int i)
{
    if (digits != 0)
    {
        i++;
        getDigits(digits/10, i);                
    }

    return i;
}

ステップ1:

digits = 5428
i      = 0

ステップ2:

digits = 542
i      = 1

[...] をインクリメントiしますが、再帰の結果を返すのではなく、iステップ #1 で の値を返します。

今、あなたがこのようにすると:

public static int GetDigits(int number, int digits)
{
    if (number == 0)
    {
        return digits == 0 ? 1 : digits;
    }

    return GetDigits(number / 10, ++digits);
}

再帰から値を返します。

ステップ1:

number = 5428
digits = 0

ステップ2:

number = 542
digits = 1

ステップ #3:

number = 54
digits = 2

ステップ #4:

number = 5
digits = 3

ステップ #5:

number = 0
digits = 4

ステップ #5 は の状態に入り、このステップではである をステップ #4 に(number == 0)戻します。digits4

ステップ #4 は、ステップ #5 の結果をステップ #3 に返しますGetDigits(number / 10, ++digits);

ステップ #3 は、ステップ #4 の結果をステップ #2 に返しますGetDigits(number / 10, ++digits);

ステップ #2 は、ステップ #3 の結果をステップ #1 に返しますGetDigits(number / 10, ++digits);

次に、ステップ #1 は4、再帰の最後の対話から取得した結果である値を返します。

C# での接頭辞と接尾辞の操作の説明(++digits over digits++)

于 2012-09-21T11:19:01.113 に答える
-3

if (digits != 0)除算でゼロを取得できないのは間違った条件であり、ifステートメントを使用する必要があります

if (digits != 0)
{
     i++;
     return getDigits(digits/10, i);                
}
else
{
     return i;
}
于 2012-09-21T11:07:40.733 に答える