无需比较运算符的最大值递归函数返回递减值问题求助
问题分析与修正方案
你的代码核心问题是:每次递归调用都会重新定义TrueA和TrueB,这两个变量仅存储当前递归层级传入的A、B值,而非最初调用时的原始输入值。以WhoBig(9,2)为例:
- 第一次递归:
TrueA=9、TrueB=2,因A、B均不为0,调用WhoBig(8,1) - 第二次递归:
TrueA=8、TrueB=1,继续调用WhoBig(7,0) - 第三次递归:触发
B==0条件,返回当前层级的TrueA=7,而非原始输入的9,导致结果不符合预期。
修正方案1:用辅助函数传递初始值
新增辅助函数,将最初的A、B值作为参数传递,确保递归终止时能返回原始的较大值:
#include <stdio.h> // 辅助函数:origA、origB保存首次调用的原始值 int WhoBigHelper(int A, int B, int origA, int origB) { if (A == 0) { return origB; } else if (B == 0) { return origA; } else { return WhoBigHelper(A - 1, B - 1, origA, origB); } } // 对外接口函数,封装初始值传递逻辑 int WhoBig(int A, int B) { return WhoBigHelper(A, B, A, B); } int main() { printf("%d", WhoBig(9, 2)); // 输出:9 return 0; }
修正方案2:无辅助函数的递归逻辑
利用递归返回值推导差值,直接计算原始较大值:
#include <stdio.h> int WhoBig(int A, int B) { if (A == 0) { return B; } else if (B == 0) { return A; } else { // 每次递归返回差值,加1后还原为上一层级的相对差值,最终得到原始较大值 return WhoBig(A - 1, B - 1) + 1; } } int main() { printf("%d", WhoBig(9, 2)); // 输出:9 return 0; }
内容的提问来源于stack exchange,提问作者Inferno
相关产品推荐
相关产品推荐

