递归调用过程
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
关键理解点
- 递归的本质: 程序先递归到最深层('9'),然后依次返回
- printf的位置:
printf
语句在递归调用之后,所以是在返回过程中执行的 - 输出顺序: 因为递归的特性,输出顺序是从 '9' 到 '0',即倒序输出
答案
正确答案是 B. '9876543210'