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,但是当函数从递归返回时, 的值为i1,然后您返回 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 输入 的条件(number == 0)并返回到步骤#4 digits,在这一步是。4

第 4GetDigits(number / 10, ++digits);步将第 5 步的结果返回到第 3 步。

第 3GetDigits(number / 10, ++digits);步将第 4 步的结果返回到第 2 步。

步骤#2 将GetDigits(number / 10, ++digits);步骤#3 的结果返回到步骤#1。

然后步骤 #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 回答