您好我需要构建一个用零替换偶数的递归: 例如 - 1254的数字是1050 数字332-将是330 数字24 - 将为0
我开始研究它,但一段时间后变得非常无能
public static int replaceEvenDigitsWithZero(int number){
if(number<1)
return number;
if(number%2==0 && number%10!=0){
int temp=number%10;
return(number/10+replaceEvenDigitsWithZero(number-temp));
}
return(replaceEvenDigitsWithZero(number/10));
}
public static void main(String[] args) {
int num1 = 1254;
System.out.println(num1 + " --> " + replaceEvenDigitsWithZero(num1));
int num2 = 332;
System.out.println(num2 + " --> " + replaceEvenDigitsWithZero(num2));
int num3 = 24;
System.out.println(num3 + " --> " + replaceEvenDigitsWithZero(num3));
int num4 = 13;
System.out.println(num4 + " --> " + replaceEvenDigitsWithZero(num4));
}
}
答案 0 :(得分:4)
由于您的方法仅查看最后一位数字,因此input / 10
时应始终使用input >= 10
调用自己。
然后取出递归返回的值,将其乘以10并将最后一位数字加回去,如果是奇数。
public static int replaceEvenDigitsWithZero(int number) {
int result = 0;
if (number >= 10)
result = replaceEvenDigitsWithZero(number / 10) * 10;
if (number % 2 != 0)
result += number % 10;
return result;
}
答案 1 :(得分:2)
如果您需要1-liner,请点击:;)
public static int replaceEvenDigitsWithZero(int number) {
return (number%2 == 0 ? 0 : number % 10) + (number<10 ? 0 : 10 * replaceEvenDigitsWithZero(number / 10));
}
答案 2 :(得分:2)
嗯......设计一个递归算法总是有相同的步骤:
识别基本案例,即终止递归调用的场景。
将问题缩小为更小(朝向基本情况)。
对于这个要求,可以通过除以10来轻松地解决问题。这也容易导致基本情况:单个数字是基本情况。因此,快速实施可以是:
public static int replaceEvenDigitsWithZero(int number) {
// I added handling of negative numbers ...
if (number < 0) {
return -replaceEvenDigitsWithZero(-number);
}
// base case
if (number < 10) {
return replaceOneDigit(number);
}
// recursion
int lastDigit = number % 10;
int remainder = number / 10;
return replaceEvenDigitsWithZero(remainder) * 10 + replaceOneDigit(lastDigit);
}
public static int replaceOneDigit(int digit) {
return (digit % 2 == 0) ? 0 : digit;
}
我添加了一个辅助方法,用于将偶数转换为零。
现在的输出是:
1254 - &gt; 1050
332 - &gt; 330
24 - &gt; 0
13 - &gt; 13
答案 3 :(得分:0)
您需要跟踪您号码中的当前位置。 在当前函数中,您将只返回数字的第一个数字(因为每次调用递归时都将它除以10)。
public static int replaceEvenDigitsWithZero(int number, int position){
// cancel condition:
if(number < 10 * position) {
return number;
}
// edit number:
if (position > 0) {
int currentNumber = number / (10 * position);
} else {
currentNumber = number;
}
if(currentNumber%2==0){ //even?
int multiplyValue = currentNumber % 10; // get rest of division by 10 (== digit in current position)
number = number - (multiplyValue * (10 * position)); // set current position to zero
}
// recursive call:
return replaceEvenDigitsWithZero(number,position+1);
}
没有测试我的代码,但我希望你知道如何做到这一点。
使用replaceEvenDigitsWithZero(num1,0)
开始。
答案 4 :(得分:-2)
1转换为String
2 F(字符串):取第一个号码:将0,6,4,8,8个字符替换为0
3连接到F(剩下的字符串)
4转换为int