[英]Java- Builiding a recursion that replace even digits with zero
您好我需要构建一个递归,用偶数数字替换零:例如,数字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));
}
}
由于您的方法仅查看最后一位数,因此当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-liner,这里是:;)
public static int replaceEvenDigitsWithZero(int number) {
return (number%2 == 0 ? 0 : number % 10) + (number<10 ? 0 : 10 * replaceEvenDigitsWithZero(number / 10));
}
嗯......设计一个递归算法总是有相同的步骤:
确定基本情况 ,即终止递归调用的方案。
将问题减小到更小(朝向基本情况)。
对于这个要求,可以通过除以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 - > 1050
332 - > 330
24 - > 0
13 - > 13
您需要跟踪您号码中的当前位置。 在当前函数中,您将只返回数字的第一个数字(因为每次调用递归时都将它除以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)
启动。
1转换为String
2 F(字符串):取第一个数字:将2,4,6,8个字符替换为0
3连接到F(剩下的字符串)
4转换为int
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.