如何在递归函数末尾仅打印一次指定内容?
解决递归函数多次打印
End1的问题 原问题代码
#include<stdio.h> void func1(int i){ if(i == 6) return; // Base Case printf("%d ", i); func1(i + 1); printf("\nEnd1"); } int main() { func1(1); return 0; }
问题原因
你的代码中,printf("\nEnd1");写在递归调用func1(i+1);之后。递归的执行逻辑是:每进入一层func1,先打印数字,再调用下一层递归;直到触发i==6的终止条件返回后,每一层递归的剩余代码都会继续执行——也就是每返回一层,就会打印一次End1。
从i=1到i=5一共触发了5次非终止条件的递归调用,所以最终会打印5次End1。
解决思路
要实现只打印一次End1,需要让这个打印操作仅在整个递归流程完全结束后执行一次,而非每一层递归返回都执行。
方案1:将打印逻辑移到main函数中(最简洁)
修改后代码:
#include<stdio.h> void func1(int i){ if(i == 6) return; // Base Case printf("%d ", i); func1(i + 1); } int main() { func1(1); printf("\nEnd1"); // 仅在全部递归完成后打印一次 return 0; }
执行后递归完成所有数字打印,回到main函数再触发一次End1打印,完全符合你的期望输出。
方案2:给递归函数添加顶层调用标记(不修改main的可选方案)
如果不想改动main函数,可以给func1增加一个参数标记是否为顶层调用:
#include<stdio.h> void func1(int i, int is_top_call){ if(i == 6) { if(is_top_call) printf("\nEnd1"); // 仅顶层调用终止时打印 return; } printf("%d ", i); func1(i + 1, 0); // 下层递归标记为非顶层 } int main() { func1(1, 1); // 第一次调用标记为顶层 return 0; }
内容的提问来源于stack exchange,提问作者pvt-Tron
相关产品推荐
相关产品推荐

