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

为什么func(44,8)的运行结果是54而非预期的45?

递归执行顺序导致的输出差异问题

问题代码

const static char NUMBERS[16]
= {'0', '1', '2', '3', '4', '5', '6' ,'7', '8', '9', 'A', 'B','C','D','E','F'};

void func(long num, int num2)
{
    long temp = num;

    if (num <= 0)
        return;
    temp /= num2;

    func(temp, num2);
    printf("%c", NUMBERS[num % num2]);
}

int main(void)
{
    func(7, 2);
    puts("");
    func(44, 8);
    puts("");
    func(2023, 16);
}

问题描述

针对func(44,8)的执行逻辑,原本的理解是:

  • 调用func(44,8)时,先调用func(5,8),然后打印NUMBERS[44%8]即NUMBERS[4],对应字符'4';
  • 调用func(5,8)时,先调用func(0,8),然后打印NUMBERS[5%8]即NUMBERS[5],对应字符'5';
    因此认为输出结果应该是45,但实际运行结果却是54,请问这是为什么?

原因分析

你搞反了递归调用与打印语句的执行顺序:

  • 调用func(44,8)时,会先计算temp = 44 / 8 = 5,随后优先执行func(5,8),这个递归调用会完全执行完毕后,才会触发当前函数的printf语句。
  • 进入func(5,8)后,计算temp = 5 / 8 = 0,接着调用func(0,8)——该调用触发if(num<=0)判断直接返回,无任何打印操作。
  • 等func(0,8)返回后,func(5,8)才会执行自身的printf,打印NUMBERS[5%8]对应的'5'。
  • 当func(5,8)完全执行完毕返回后,func(44,8)才会执行自身的printf,打印NUMBERS[44%8]对应的'4'。

实际打印顺序是先输出'5',再输出'4',最终结果为54。

递归的核心特性是先深入到最底层调用,再逐层返回执行后续语句,此处打印语句位于递归调用之后,因此会从底层到上层依次打印,与你预想的顺序完全相反。

内容的提问来源于stack exchange,提问作者Han

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:22:08