我陷入了涉及递归的运动
The question:
编写一个返回整数的递归函数,即“校验位” . 通过计算传入整数中所有数字的总和来计算该校验位 . 但是,如果结果大于或等于10(即,大于一个数字),则应使用结果作为输入再次执行计算 . 因此,直到返回的最终数字将是一个数字;这个数字是“校验位” .
An Example:
数字869419 ----> 8 6 9 4 1 9 = 37 - > 3 7 = 10 - > 1 .
***The Closest Solution I've reached : ***
public static int Bik (int n) {
int sum=0;
if (n/10 == 1 || n==1) {
return 1;
}
else {
if (n%10 != 0) {
return Bik((n/10) + (n%10));
}
return (n);
}
}
public static void main(String[] args) {
System.out.println(Bik(1892));
}
4 回答
你的Bik方法的第1行有一个问题:
每次调用它时,变量
sum
都被定义为0
,因此它永远不会改变 . 同样在您的代码中,您实际上从未对上一次迭代中的值求和 . 我可以带来的解决方案是使用前一次迭代的总和传递另一个参数:请注意,此解决方案也适用于递归必须像189235一样运行多次的数字 . 此外,我使用了三元运算符 . 您可以了解更多信息here但如果您不喜欢它,您也可以使用常规
if
语句首先,您需要检查输入是否大于10,否则只返回输入 .
然后,如果输入大于10.您需要获取组成输入的每个数字 . 要获得一个数字,只需制作模数10
input%10
. 这将为您提供最后一位数字 . 然后将输入除以10并重新操作以获得下一个数字 . 重复此操作,直到输入低于10.这里您已获得所有数字在必须对列表中的所有元素求和以获得结果之后
最后返回此结果的计算结果 . 通过这样做你使用递归,如果结果低于10它将返回,如果它更大它将再次计算 .
这些步骤的总和应该给你一些类似的东西:
编辑后 - 现在更加清晰 .
将此方法包含在您的代码中,将数字传递给digitSum