递归调用过程

C语言程序执行分析

程序代码

#include <stdio.h>
void convert(char ch)
{
    if (ch < '9') convert(ch+1);
    printf("%c", ch);
}
void main()
{
    convert('0');
}

执行过程详细分析

1. 程序启动

  • 程序从 main() 函数开始执行
  • 调用 convert('0'),传入字符 '0'

2. 递归调用过程

第1次调用: convert('0')

  • 参数: ch = '0' (ASCII值为48)
  • 判断: '0' < '9' ? 是的,因为48 < 57
  • 执行: 递归调用 convert('0'+1) = convert('1')
  • 注意: 此时还没有执行 printf("%c", ch)

第2次调用: convert('1')

  • 参数: ch = '1' (ASCII值为49)
  • 判断: '1' < '9' ? 是的,因为49 < 57
  • 执行: 递归调用 convert('1'+1) = convert('2')

第3次调用: convert('2')

  • 参数: ch = '2' (ASCII值为50)
  • 判断: '2' < '9' ? 是的,因为50 < 57
  • 执行: 递归调用 convert('2'+1) = convert('3')

第4次调用: convert('3')

  • 参数: ch = '3' (ASCII值为51)
  • 判断: '3' < '9' ? 是的,因为51 < 57
  • 执行: 递归调用 convert('3'+1) = convert('4')

第5次调用: convert('4')

  • 参数: ch = '4' (ASCII值为52)
  • 判断: '4' < '9' ? 是的,因为52 < 57
  • 执行: 递归调用 convert('4'+1) = convert('5')

第6次调用: convert('5')

  • 参数: ch = '5' (ASCII值为53)
  • 判断: '5' < '9' ? 是的,因为53 < 57
  • 执行: 递归调用 convert('5'+1) = convert('6')

第7次调用: convert('6')

  • 参数: ch = '6' (ASCII值为54)
  • 判断: '6' < '9' ? 是的,因为54 < 57
  • 执行: 递归调用 convert('6'+1) = convert('7')

第8次调用: convert('7')

  • 参数: ch = '7' (ASCII值为55)
  • 判断: '7' < '9' ? 是的,因为55 < 57
  • 执行: 递归调用 convert('7'+1) = convert('8')

第9次调用: convert('8')

  • 参数: ch = '8' (ASCII值为56)
  • 判断: '8' < '9' ? 是的,因为56 < 57
  • 执行: 递归调用 convert('8'+1) = convert('9')

第10次调用: convert('9')

  • 参数: ch = '9' (ASCII值为57)
  • 判断: '9' < '9' ? 不是,因为57 不小于 57
  • 不执行递归调用
  • 直接执行: printf("%c", ch) 输出 '9'
  • 函数返回

3. 递归返回过程(关键!)

递归调用结束后,程序开始"回溯",依次返回到之前的函数调用:

返回到 convert('8')

  • 递归调用 convert('9') 完成
  • 执行: printf("%c", ch) 输出 '8'
  • 函数返回

返回到 convert('7')

  • 递归调用 convert('8') 完成
  • 执行: printf("%c", ch) 输出 '7'
  • 函数返回

返回到 convert('6')

  • 递归调用 convert('7') 完成
  • 执行: printf("%c", ch) 输出 '6'
  • 函数返回

返回到 convert('5')

  • 递归调用 convert('6') 完成
  • 执行: printf("%c", ch) 输出 '5'
  • 函数返回

返回到 convert('4')

  • 递归调用 convert('5') 完成
  • 执行: printf("%c", ch) 输出 '4'
  • 函数返回

返回到 convert('3')

  • 递归调用 convert('4') 完成
  • 执行: printf("%c", ch) 输出 '3'
  • 函数返回

返回到 convert('2')

  • 递归调用 convert('3') 完成
  • 执行: printf("%c", ch) 输出 '2'
  • 函数返回

返回到 convert('1')

  • 递归调用 convert('2') 完成
  • 执行: printf("%c", ch) 输出 '1'
  • 函数返回

返回到 convert('0')

  • 递归调用 convert('1') 完成
  • 执行: printf("%c", ch) 输出 '0'
  • 函数返回到 main()

4. 输出结果

按照上述执行顺序,输出的字符依次为: 9876543210

关键理解点

  1. 递归的本质: 程序先递归到最深层('9'),然后依次返回
  2. printf的位置: printf 语句在递归调用之后,所以是在返回过程中执行的
  3. 输出顺序: 因为递归的特性,输出顺序是从 '9' 到 '0',即倒序输出

答案

正确答案是 B. '9876543210'

posted @ 2025-08-31 15:40  量子我梦  阅读(0)  评论(0)    收藏  举报