我正在做一个练习。我需要写一个递归函数来检查一个数字是奇数还是偶数,它需要在任何数字中切换。
例如,
- 123为真(3为奇数,2为偶数,1为奇数)
- 1234也是真的
- 12354为假(4为偶数,5为奇数,3为奇数)
数字必须在偶数和奇数之间交替。
如果数字只有一位,则返回true。所有数字都是正数。
下面是我写的函数,我找不到我的错误在哪里:/
//Assumption : num > 0
//this function will return if true or not if number is alternating
public static boolean isAlternatingNumber(int num) {
boolean flag;
if(num < 10) {
return true;
}
else {
flag = isAlternatingNumber(num/10);
int n = num% 10;
if(num%10 % 2 == 0 && flag) {
return true;
}else {
return false;
}
}
}
5条答案
按热度按时间mhd8tkvw1#
假设原始函数签名
public static boolean isAlternatingNumber(int num)
无法更改,则可以通过使用recursive helper function
向递归函数添加额外参数来解决此问题。下面是一个示例,说明如何使用
recursive helper function
来解决这个问题;luaexgnf2#
这个问题实际上可以被认为是算法问题,这会吸引更多的注意力、有趣的实现、React、建议等等。
由于OP提供了非常接近正确的解决方案,任何一个修正导致工作算法。我只是张贴可能的评价OP的想法。
在这个问题上,更有趣的是对可接受的算法有什么要求?例如,* 时间限制、内存使用限制、数据大小 * 或mb any big-o复杂度限制。
递归算法通常可以用迭代的方式重写,这通常也会导致时间/内存消耗的改善。然而,递归是优雅的,如果它不与需求或效率相矛盾,那就没什么不好的。只要记住正确的 * 基本情况 *,这样递归就不会无限,这会导致
StackOverflow
错误。PS:如果方法只接受一个参数,这肯定不是一个问题:
v6ylcynt3#
正则表达式的拯救:
esbemjvw4#
我写的函数,我找不到我的错误在哪里
方法
isAlternatingNumber
一直调用自身,直到num
小于10。例如,如果我们最初使用数字123调用方法
isAlternatingNumber
,那么将有三次对该方法的调用,如下所示:最后一个调用将返回 true。
然后,在倒数第二个调用中,该方法将继续,即执行以下行:
注意,局部变量
n
从未被使用过,所以这一行实际上并不影响isAlternatingNumber
方法返回的值:只要
num
是奇数,方法isAlternatingNumber
就会返回 false,然后每个递归调用都会返回 false。对于交替为偶数/奇数的数字的最后两位,要么该数字为偶数,除以10的数字为奇数,要么相反(除非该数字小于10,这被视为“正确”),即
如果上述表达式返回true(并且
num
大于10),则对num / 10
重复上述步骤。如果
rem1
和rem2
不具有相同的值,则flag
为真。如果
flag
为false,Java将不会[递归地]调用方法isAlternatingNumber
。mklgxw1f5#
对于递归求解,用
true/false
ets递归检查最后一位数就足够了。每次递归时,删除值的最后一位数。