为什么这种计算一个数的所有奇数位的递归方法会无限递归?
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;
}
我有这个练习,要求我创建一个程序来计算一个数字的奇数位,所以如果数字是 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;
}