精通c语言递归的请进

嵌入式小侠 2012-07-15 02:57:42
这是一个用递归逆序打印字符串的代码,后面的递归实在看不懂啊,求解释,万分感谢:

#include<stdio.h>
int main()
{
char sentence[80];
void reverse(char *);

printf("Enter a line of text:\n");
gets(sentence);
printf("\nThe line printed backwards is:\n");
reverse(sentence);
printf("\n");
return 0;
}
void reverse(char *s)
{
if(s[0]=='\0')
return;
else
{
reverse(&s[1]);
putchar(s[0]);
}

}
...全文
220 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
嵌入式小侠 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

谢谢各位,3楼的讲解太给力了,我再慢慢体会去。

与其说看不懂递归,我倒觉得你是没看懂那个&s[1]的意义,也就是没熟悉指针。
&s[1]可以改为s+1,改后你再看看懂没懂。
[/Quote]问题确实在这,这下真懂了
hnust_CLP 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

递归用到的是栈
你看看数据结构的“栈”,你就明白了
[/Quote]
++,函数的递归调用就是一个出入栈的过程,每调用一次reverse函数,使一个函数入栈,说明该函数还未执行完,等到符合了if条件,返回一个值时,就执行出栈一次,也就是说明之前最近一次入栈的函数执行完了,输出一个值(s[0]),一层一层出栈,直到栈为空时,递归就完成了。
chaoliu1024 2012-07-15
  • 打赏
  • 举报
回复
递归用到的是栈
你看看数据结构的“栈”,你就明白了
hnzmdzcm 2012-07-15
  • 打赏
  • 举报
回复
经典递归:汉诺塔

#include <iostream>
using namespace std;

//递归解决汉诺塔问题, 从from上移动n个盘子到to上
//n表示盘子的个数
void hannuo(char from, int n, char to, char temp)
{
if(n > 0)
{
hannuo(from, n-1, temp, to);
cout << "移动第" << n << "个盘子:" << "从" << from << "到" << to << endl;
hannuo(temp, n-1, to, from);
}
}
zoopang 2012-07-15
  • 打赏
  • 举报
回复
在理解上题的基础上,想加深理解递归建议楼主看看这个程序:
http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/Permutation.htm
laciqs 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

谢谢各位,3楼的讲解太给力了,我再慢慢体会去。
[/Quote]
与其说看不懂递归,我倒觉得你是没看懂那个&s[1]的意义,也就是没熟悉指针。
&s[1]可以改为s+1,改后你再看看懂没懂。
嵌入式小侠 2012-07-15
  • 打赏
  • 举报
回复
谢谢各位,3楼的讲解太给力了,我再慢慢体会去。
lihongbo6668201 2012-07-15
  • 打赏
  • 举报
回复
3楼讲的很清楚,建议lz单步调试,一步步查看内存变化了解其中的原理
proorck6 2012-07-15
  • 打赏
  • 举报
回复
递归属于硬气功,需要练习。
W170532934 2012-07-15
  • 打赏
  • 举报
回复
楼上讲解的极是。建议楼主设置一个比较小的初始值,单步调试,跟着流程走一遍。肯定会领悟递归的真谛
pathuang68 2012-07-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
这是一个用递归逆序打印字符串的代码,后面的递归实在看不懂啊,求解释,万分感谢:

#include<stdio.h>
int main()
{
char sentence[80];
void reverse(char *);

printf("Enter a line of text:\n");
gets(sentence);
printf("\nThe line printe……
[/Quote]

参考:

#include<stdio.h>

void reverse(char *s)
{
if(s[0]=='\0') return; // 如果是空字符串就退出
else
{
reverse(&s[1]); // 如果原字符串是"abc", 那么第一次递归的时候传入的参数就是"bc"
putchar(s[0]); // 输出s中的第一个字符a
}
}

int main()
{
char sentence[80];
void reverse(char *);

printf("Enter a line of text:\n");
gets(sentence);
printf("\nThe line printed backwards is:\n");
reverse(sentence);
printf("\n");
return 0;
}


建议楼主用一个较短的字符串,去单步调式反复体会。

假定原字符串是"abc"
第一次递归的时候:
reverse(&s[1]); // 如果原字符串是"abc", 那么第一次递归的时候传入的参数就是"bc"
putchar(s[0]); // 输出s中的第一个字符a,但这个输出要等到上面的reverse完成后才会执行

第二次递归的时候:
reverse(&s[1]); // 上一次穿过来的字符串是"bc", 那么下一次递归的时候传入的参数就是"c"
putchar(s[0]); // 输出s中的第一个字符b,但这个输出要等到上面的reverse完成后才会执行

第三次递归的时候:
reverse(&s[1]); // 上一次穿过来的字符串是"c", 那么下一次递归的时候传入的参数就是'\0'
putchar(s[0]); // 输出s中的第一个字符c,但这个输出要等到上面的reverse完成后才会执行

reverse碰到'\0'了,所以退出。

现在退到第三次递归,reverse执行完成了,所以输出字符c
现在退到第二次递归,reverse执行完成了,所以输出字符b
现在退到第一次递归,reverse执行完成了,所以输出字符a

所以,看起来就是输出了cba
baichi4141 2012-07-15
  • 打赏
  • 举报
回复
了解递归的定义,单步跟踪一遍,就什么都懂了

如果你不会单步跟踪,要么赶紧百度什么是单步跟踪,要么赶紧转行
如果你觉得单步跟踪这件事需要学习,那么赶紧转行
左眼看到鬼 2012-07-15
  • 打赏
  • 举报
回复
本人不精通,菜鸟一个,进来看看,走了,,,,

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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