You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在递归函数末尾仅打印一次指定内容?

解决递归函数多次打印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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:33:20