哪位好心人帮忙看看

bruceleelc 2009-08-20 07:37:03
#include<iostream.h>

void f(int a)
{
if(a==0) return; //A
f(a/10); //B
cout<<a%10; //C
}


void main(void)
{
int a;
cout<<"输入一个整数:";
cin>>a;
f(a);
cout<<'\n';
}
这个是求一个整数正序输出的程序,结果 是对了,但不明白是怎么样一个运行的过程,我感觉C行就没有运行啊,比如当a=345,f(345)先运行A行,此时a!=0,接着去执行B行,再转到f(34),a=34,执行A行,a!=0,接着去执行B行再转到f(3),这样下去,怎么C行就没有运行呢,但结果还是出来了,请解释一下
...全文
83 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dave888Zhou 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 bruceleelc 的回复:]
......
我感觉C行就没有运行啊,比如当a=345,f(345)先运行A行,此时a!=0,接着去执行B行,再转到f(34),a=34,执行A行,a!=0,接着去执行B行再转到f(3),这样下去,怎么C行就没有运行呢,但结果还是出来了,请解释一下
[/Quote]
看楼主的分析,对递归还是挻了解的呀。一脑子想着“递”,那“归”呢,递了还要归呀。你的每次调用“归”了以后(即执行完),回到上层调用时,不就会去执行下面的cout<<a%10了吗?

这就是递归与递推的区别呀,递归有“归”,而递推没有“归”。
self_control 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 bruceleelc 的回复:]
#include <iostream.h>

void f(int a)
{
if(a==0) return;  //A
f(a/10);          //B
cout < <a%10;      //C
}


void main(void)
{
int a;
cout < <"输入一个整数:";
cin>>a;
f(a);
cout < <'\n';
}
这个是求一个整数正序输出的程序,结果 是对了,但不明白是怎么样一个运行的过程,我感觉C行就没有运行啊,比如当a=345,f(345)先运行A行,此时a!=0,接着去执行B行,再转到f(34),a=34,执行A行,a!=0,接着去执行B行再转到f(3),这样下去,怎么C行就没有运行呢,但结果还是出来了,请解释一下
[/Quote]

然后你继续啊
f(3)执行,然后执行B行,然后f(0)了吧?f(0)直接return了,那么就执行f(3)的C行了咯。
再一个个回去咯。
lzy0001sl 2009-08-20
  • 打赏
  • 举报
回复
假如输入:123
运行A1,运行B1;
运行A2(输入变为12),运行B2;
运行A3(输入变为1), 运行B3;
运行A4(输入变为0),返回;
运行C3,返回;
运行C2,返回;
运行C1,返回;
mr_leo17895 2009-08-20
  • 打赏
  • 举报
回复
f(3)会接执行f(3/10),即f(0),a==0,返回了,相当于f(3/10)执行完毕,按照顺序,这时就执行cout << 3%10了,这时f(3)(即f(34/10))执行完毕,接着执行cout << 34%10,依此类推,这是一个递归程序
jixingzhong 2009-08-20
  • 打赏
  • 举报
回复
递归调用,不是说递归了,就不返回了,在完成递归后,这个函数还是会返回的,所以递归后面的语句会被执行

以你的例子:
当a=345,f(345)先运行A行,此时a!=0,接着去执行B行,再转到f(34),a=34,执行A行,a!=0,接着去执行B行再转到f(3),然后是f(0),此时执行A是条件为true,返回,继续f(3)中调用f(0)的后续语句,即cout <<3%10;
。。。


如果感觉比较混乱,可以简单一点,这么理解:
void f(int a)
{
if(a==0) return; //A
f_2(a/10); //B,这个函数实现逆向输出 参数 各个数值
cout <<a%10; //C
}
PeacefulBY 2009-08-20
  • 打赏
  • 举报
回复
楼上正解,入栈出栈的过程
gauss85 2009-08-20
  • 打赏
  • 举报
回复
就是递归过程啊:
a=345,f(345)先运行A行,此时a!=0,接着去执行B行,再转到f(34)(第一层递归),a=34,执行A行,a!=0,接着去执行B行再转到f(3)(第二层递归),a!=0,接着去执行B行再转到f(0)(第三层递归),这时a==0,结束,跳出第三层递归;回到第二层,执行第二层的C行,输出3,然后结束跳出第二层递归;回到第一层里面,输出34%10=4,然后结束跳出第1层递归;回到第0层(也就是原始的调用),输出345%10=5,最后返回主程序
Paradin 2009-08-20
  • 打赏
  • 举报
回复
f(345)
f(34)
f(3)
cout<<3%10(打印 3)
cout<<34%10(打印 4)
cout<<345%10(打印 5)

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧