筛选含1/2/3数字的整数程序:递归函数返回值问题求助
解决递归函数无返回值的问题
嘿,这个问题我之前帮刚学Java的朋友搞定过,咱们一步步来捋清楚~
首先得明确:Java里只要方法声明了返回类型(比如你这里的boolean),所有代码分支都必须返回对应类型的值,不然编译器肯定会报错。你说的else分支没返回值,就是因为你只调用了递归函数,但没把它的结果返回给上层调用者,这就相当于这条路径“断了”,编译器不知道该给调用者返回啥。
先理清楚你的递归逻辑应该怎么完善
你的核心思路是对的:递归检查每一位数字是否是1、2、3。那我们得把递归的终止条件和每一步的返回逻辑补全:
- 终止条件:当整数被拆到0的时候,说明所有位都检查完了,没找到符合条件的数字,这时候返回
false。 - 当前位检查:如果当前最后一位是1/2/3,直接返回
true;如果不是,就递归检查剩下的部分(也就是把数字除以10后的结果),并且要把递归的结果返回——因为剩下部分的检查结果就是当前整个数字的检查结果呀!
给你改好的完整代码示例
import java.util.Scanner; public class NumberFilter { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入一个整数:"); int input = scanner.nextInt(); if (contains123(input)) { System.out.println(input); } scanner.close(); } private static boolean contains123(int num) { // 先处理负数,把数字转成绝对值,避免漏判负数里的1/2/3 num = Math.abs(num); // 终止条件:所有位都检查完毕,没找到目标数字 if (num == 0) { return false; } int lastDigit = num % 10; if (lastDigit == 1 || lastDigit == 2 || lastDigit == 3) { // 当前位符合条件,直接返回true return true; } else { // 递归检查剩下的数字,并且把结果返回给上层 return contains123(num / 10); } } }
关键修改点说明
- 你之前的else分支里可能只写了
contains123(num / 10);,但没有加return,这就是问题所在——递归调用的结果需要被返回,这样每一层递归的判断才能传递到最开始的调用处。 - 加了
Math.abs(num)是为了处理负数的情况,比如输入-123的时候,也能正确识别里面的1、2、3。
这样修改后,你的程序就能正常运行啦:输入整数后,只有包含1、2或3的数会被输出。
内容的提问来源于stack exchange,提问作者Java_Beginner
相关产品推荐
相关产品推荐

