返回值为布尔类型的递归方法是否必须添加return语句?
问题解答
报错的核心原因
你遇到的报错和递归本身没有特殊关系,是Java方法的基础语法要求:只要方法声明了非void的返回值类型,所有代码执行分支都必须返回对应类型的值,不管是不是递归方法。
你第一段代码的n>2分支存在逻辑漏洞:
public static boolean isSumOfDigitsOdd(int n) { if (n <= 0) { return false; } else if (n == 1) { return true; } else if (n == 2) { return false; } else if (n > 2) { int temp1 = n % 10; int temp2 = (n / 10) % 10; int tempFinal = temp1 + temp2; while (tempFinal > 2) { tempFinal -= 2; } isDigitSumOdd((n / 100) + tempFinal); // 这里只调用了递归方法,没有返回调用结果 } // 走到这里没有任何返回值,不符合boolean返回类型的要求 }
这个分支执行完后没有返回任何值,编译器检测到存在没有返回值的执行路径,就会直接抛出返回类型不匹配的错误。
第二段代码可正常运行的原因
你修改后的代码覆盖了所有分支的返回路径:
public static boolean isDigitSumOdd(int n) { boolean x = false; if (n <= 0) { x = false; } else if (n == 1) { x = true; } else if (n == 2) { x = false; } else if (n > 2) { int temp1 = n % 10; int temp2 = (n / 10) % 10; int tempFinal = temp1 + temp2; while (tempFinal > 2) { tempFinal -= 2; } return isDigitSumOdd((n / 100) + tempFinal); // 这里直接返回递归调用的结果 } return x; // 所有非n>2的分支,最终都会走到这里返回x的值 }
不管入参n走哪个判断分支,最终都会返回一个boolean类型的值,完全符合Java语法要求,所以可以正常运行。
递归方法的返回值规则
递归方法的返回值规则和普通方法完全一致,没有特殊要求:
- 如果方法声明了非
void的返回值,所有执行分支都必须返回对应类型的值,如果递归调用的结果需要向上传递给上一层调用,必须用return返回该结果 - 只有返回值为
void的递归方法,才不需要写return(也可以写不带返回值的return用来提前终止方法执行)
额外优化提示
你代码里反复减2判断奇偶的逻辑,可以直接用取模运算简化:tempFinal % 2,结果为1就是奇数、0就是偶数,不需要循环操作。另外判断各位数字和的奇偶性,本质只需要统计所有位里奇数的个数:奇数个奇数相加结果为奇,偶数个奇数相加结果为偶,你可以尝试更简化的实现逻辑。
内容的提问来源于stack exchange,提问作者Javier Tan
相关产品推荐
相关产品推荐

