递归中void类型操作数无效问题求助:数字拆分递归实现编译报错
递归拆分数字的编译器错误解决指南
你的问题
我尝试用递归拆分数字(例如将123拆分为12、3),但因使用了void类型函数podzial,编译器报错:“invalid operands of types 'void' and 'int' to binary 'operator !='”,错误出现在递归调用的最后一行。我原以为是开头a和b的比较问题,但a、b均为int类型,不理解为何无法与0比较。相关代码如下:
void podzial ( int N, int a, int b, int & k ) { if(N==0 and a!=0 and b!=0) if(prime(a,b)) { cout<<a<<b<<endl; k++; } else if(N==0) return; else { a*=10; b*=10; podzial(N/10,a+(N%10),b,k) or podzial(N/10,a,b+(N%10),k); } }
问题根源:你用错了or!
别纠结a!=0和b!=0啦——这两个判断完全没问题,a和b都是int,和0比较是合法的。真正的坑在最后一行的or操作上:
podzial(N/10,a+(N%10),b,k) or podzial(N/10,a,b+(N%10),k);
C++里的or(和||是同一个东西,逻辑或)要求左右两边的表达式必须能转换成布尔值,但你的podzial是void类型函数——它不返回任何值,怎么可能参与逻辑运算呢?编译器看到你把两个无返回值的函数调用用or连起来,直接就懵了,所以抛出了这个错误。
怎么改?
你的需求应该是遍历所有可能的拆分方式,对吧?那根本不需要用or,直接把两个递归调用分开写就行,依次执行它们就能覆盖所有拆分情况了。我帮你修改了代码,还调整了if的结构,让逻辑更清晰:
void podzial ( int N, int a, int b, int & k ) { // 先处理递归终止条件 if(N == 0) { // 只有a和b都不为0时才检查质数 if(a != 0 && b != 0) { if(prime(a,b)) { cout << a << b << endl; k++; } } return; } // 递归分支:把当前最后一位加到a上 int new_a = a * 10 + (N % 10); int new_b = b * 10; podzial(N/10, new_a, new_b, k); // 递归分支:把当前最后一位加到b上 new_a = a * 10; new_b = b * 10 + (N % 10); podzial(N/10, new_a, new_b, k); }
额外小提示
如果以后你需要递归函数返回一个结果(比如判断是否存在符合条件的拆分),可以把podzial的返回类型改成bool,这样就能用||来实现“找到一个就停止”的短路逻辑,但在这个场景下,你需要遍历所有可能的拆分,所以直接分开调用两个递归函数才是正确的做法。
内容的提问来源于stack exchange,提问作者Ola
相关产品推荐
相关产品推荐

