为什么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
相关产品推荐
相关产品推荐

