如何让递归实现的GCD函数输出符合预期格式?
问题
我希望递归实现的GCD函数输出符合如下预期格式:
预期输出示例
Calling: gcd(20,12) Calling: gcd(12,8) Calling: gcd(8,4) Calling: gcd(4,0) Returning: 4 from gcd(4,0) Returning: 4 from gcd(8,4) Returning: 4 from gcd(12,8) Returning: 4 from gcd(20,12) Returning: 4 from gcd(12,20)
但当前我的输出仅为:
当前输出
Calling: gcd(10,16) Calling: gcd(16,10) Calling: gcd(10,6) Calling: gcd(6,4) Calling: gcd(4,2) Returning: 2 from gcd(2,0)
我的实现代码如下:
我的代码
public static int gcd(int x, int y, String indent) { if (y == 0) { System.out.println(indent + "Returning: " + x + " from gcd(" + x + "," + y + ")"); return x; } else { System.out.println(indent + "Calling: gcd(" + x + "," + y + ")"); indent = indent + " "; return gcd(y, x % y, indent); } }
请问如何修改代码,让输出符合预期的完整调用与返回层级?
解决方案
问题核心是你只在递归终止条件(y==0)时打印了返回信息,递归调用返回后,没有打印当前层级的返回日志,导致输出缺失了后续的返回语句。
修改思路:在递归调用完成后,添加当前层级的返回打印语句,且要使用调用前的原始缩进,保证返回日志的层级和调用时一致。
修改后的代码:
public static int gcd(int x, int y, String indent) { if (y == 0) { System.out.println(indent + "Returning: " + x + " from gcd(" + x + "," + y + ")"); return x; } else { System.out.println(indent + "Calling: gcd(" + x + "," + y + ")"); // 保存当前缩进,避免修改后影响返回日志的层级 String nextIndent = indent + " "; // 先执行递归调用并获取结果 int result = gcd(y, x % y, nextIndent); // 递归返回后,打印当前层级的返回信息 System.out.println(indent + "Returning: " + result + " from gcd(" + x + "," + y + ")"); return result; } }
改动说明
- 用
nextIndent变量存储下一层级的缩进,保留当前函数的原始缩进,用于后续打印返回日志。 - 先完成递归调用并保存结果,再打印当前函数的返回语句,确保每个调用层级都有对应的返回日志。
- 返回日志使用当前函数的原始缩进,保证输出的层级结构和调用时完全对应。
修改后,每次递归调用返回时都会打印对应层级的返回语句,就能得到和预期一致的完整调用与返回层级输出。
内容的提问来源于stack exchange,提问作者displayname1
相关产品推荐
相关产品推荐

