我将此方法用于课堂上的作业。计算任何给定数字中出现的“ 1”的数量。我想对此进行扩展,学习如何取一个数字,如果是偶数,则将其加一个。如果它是奇数,则使用递归从中减去一个,然后返回更改后的数字。
public static int countOnes(int n){
if(n < 0){
return countOnes(n*-1);
}
if(n == 0){
return 0;
}
if(n%10 == 1){
return 1 + countOnes(n/10);
}else
return countOnes(n/10);
}
0 = 1 27 = 36,依此类推。我将不胜感激。
答案 0 :(得分:1)
每当处理递归时,请首先考虑基本情况。我们正在处理的最简单的情况是什么?如果数字只有一位数字,对吗?
如果数字小于10(单个数字),我们可以使用简单的if语句来确定要返回的内容。
然后,当我们遇到更复杂的案例时,我们将考虑如何递归到达基本案例。一种方法是将数字分为第一位数和其余位数。首先更改其第一个数字,然后将其乘以10的幂,然后将更改后的数字与其余数字相加。
public static int changeDigits(int i) {
if (i < 10) {
if (i % 2 == 0) {
return i + 1;
} else {
return i - 1;
}
}
int magnitude = (int)Math.log10(i);
int powerOf10 = (int)Math.pow(10, magnitude);
int firstDigit = i / powerOf10;
int rest = i % powerOf10;
return changeDigits(firstDigit) * powerOf10 + changeDigits(rest);
}
答案 1 :(得分:1)
您通常会发现在递归解决方案中使用私有方法可使您的代码更加清晰。
/**
* Twiddles one digit.
*/
private static int twiddleDigit(int n) {
return (n & 1) == 1 ? n - 1 : n + 1;
}
/**
* Adds one to digits that are even, subtracts one from digits that are odd.
*/
public static int twiddleDigits(int n) {
if (n < 10) return twiddleDigit(n);
return twiddleDigits(n / 10) * 10 + twiddleDigit(n % 10);
}