为什么这种计算一个数的所有奇数位的递归方法会无限递归?

Why this recursive method for counting all the odd digits of a number makes infinite recursion?

我有这个练习,要求我创建一个程序来计算一个数字的奇数位,所以如果数字是 12345,它将计数为 3,因为有 1、3 和 5。我开始创建一个递归方法,我的第一个方法,带有分支的 if-else。使用它的目的是为了看到if (inputNumber % 2 == '0')。如果是,则数字的最后一位将是 0、2、4、6 或 8,因为如果以 2 为模,只有这些数字给出 0,因此 oddDigitsCounter 不会增长。否则,if (inputNumber % 2 == '1'),数字的最后一位将是 1、3、5、7 或 9。oddDigitCounter++;,所以。为了逐位检查,我尝试将数字除以十,因为它是一个 int 变量,所以它不会在浮点数之后保存任何数字。 这是从现在开始的方法:

public static int oddDigitCounter (int number) {

    int oddCount, moduledNumber, dividedNumber, absoluteInput;

    oddCount = 0;
    absoluteInput = Math.abs(number);
    moduledNumber = absoluteInput % 2;
    dividedNumber = absoluteInput / 10;

    if (absoluteInput == '0') {
        oddCount = oddCount;  }
    else if (moduledNumber == '0') {
        oddCount = oddCount;
        oddDigitCounter(dividedNumber); }
    else // (number % 2 != 0) 
        oddCount++;
        oddDigitCounter(dividedNumber); }

    return oddCount;

为什么它给我无限递归?怎么了?为什么?还有其他方法可以解决这个问题吗?有改进我程序的想法吗?

如评论中所述,您应该与 0 而不是 '0' 进行比较。后者将被解释为 48,数字零的 ASCII 字符。

此外,absoluteInput 永远不会分配给 0,并且将始终具有其初始值。 inputAssoluto从哪里来?

您没有使用递归调用的结果。您还将整数与字符“0”进行了比较,这与与 0 进行比较不同。

public static int oddDigitCounter (int number) 
{
    int moduledNumber, dividedNumber, absoluteInput;

    inputAssoluto = Math.abs(numero);
    moduledNumber = absoluteInput % 2;
    dividedNumber = absoluteInput / 10;

    if (absoluteInput == 0) {
        return 0;
    }
    else if (moduledNumber == 0) {
        return oddDigitCounter(dividedNumber); 
    }
    else {
        return 1 + oddDigitCounter(dividedNumber); 
    }
}

在递归之外声明奇数计数器,您应该会得到结果:

static int oddCounts;

public static int oddDigitCounter(int number) {
    int moduledNumber, dividedNumber, absoluteInput = 0;

    absoluteInput = Math.abs(number);
    moduledNumber = absoluteInput % 2;
    dividedNumber = absoluteInput / 10;

    if (absoluteInput == 0) {
        return 0;
    } else if (moduledNumber == 0) {
        return oddDigitCounter(dividedNumber);
    } else {
        oddCounts++;
        return 1 + oddDigitCounter(dividedNumber);
    }
}

您不想列出您的数字,然后再次将每个数字作为单个整数检查,这意味着您可以逐位检查,而不必将数字除以十。

一个非常简短的解决方案就足够了:(如果您将数字作为字符串传递,LINQ 单行程序可以为您提供所需的内容)。

static int OddDigitCounter(int numbers)
{
    var c = numbers.ToString();
    var oddcount = c.Count(no => int.Parse(no.ToString()) % 2 != 0); //<--one liner 
    return oddcount;
}