双重递归如何更好理解?

saishow 2010-08-07 04:49:37
long nn(int n){
if (n > 2)
return nn(n-1)+nn(n-2);
else
return 1;
}


怎么样分析这个函数.双重递归.请写个简单的流程.谢谢
...全文
582 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckli 2010-08-09
  • 打赏
  • 举报
回复
long nn(int n){
if (n > 2){
printf("begin calculating nn( %d )\n",n);
return nn(n-1)+nn(n-2);
printf("end calculating nn( %d )\n",n);
}
else{
printf("calculate nn(1) or nn(2)\n");
return 1;
}
}
luckli 2010-08-09
  • 打赏
  • 举报
回复
不知道你是要看什么,
看哪个先执行,哪个后执行的话,
可以加一些输出语句
scchao1986 2010-08-09
  • 打赏
  • 举报
回复
当n =4时
return nn(3)+nn(2)
n = 3 时
return nn(2)+ nn(1)
n = 2 时
return 1
n = 1 时
return 1
所以 n = 3 时 return 2
n = 4时 return 3
canshui 2010-08-08
  • 打赏
  • 举报
回复
递归就是,进栈、出栈的操作
canshui 2010-08-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chinesedragon2010 的回复:]
引用 7 楼 saishow 的回复:
引用 5 楼 ayw215 的回复:
自己在纸上画图


要怎么画呢?

我建议楼主详细看看 谭浩强的<C程序设计>的关于递归那部分,应该可以加深你的理解
[/Quote]
他的不详细!
lz要看的是 “栈” 的内容……
sky_pearl 2010-08-08
  • 打赏
  • 举报
回复
带一个数进去一步步跟着算算看
这个其实就是不同的规则调用相同的函数 每次调用了以后会继续调用直到出口。到了出口以后就变成一个固定的数字,关键就是它有几层。最后再一层层地返回来
saishow 2010-08-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lishanchao 的回复:]
把函数调用堆栈理解了,递归就理解了。需要有一点点汇编基础:
http://blog.csdn.net/langchibi_zhou/archive/2007/09/25/1800001.aspx
[/Quote]

感谢你的回复.汇编还没学到这步.
沭水河畔 2010-08-07
  • 打赏
  • 举报
回复
把函数调用堆栈理解了,递归就理解了。需要有一点点汇编基础:
http://blog.csdn.net/langchibi_zhou/archive/2007/09/25/1800001.aspx
saishow 2010-08-07
  • 打赏
  • 举报
回复
还是自己学好了汇编再来理解这题.
chinesedragon2010 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 saishow 的回复:]
引用 5 楼 ayw215 的回复:
自己在纸上画图


要怎么画呢?
[/Quote]
我建议楼主详细看看 谭浩强的<C程序设计>的关于递归那部分,应该可以加深你的理解
saishow 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 weixiaoshashou 的回复:]
引用楼主 saishow 的回复:
C/C++ code
long nn(int n){
if (n > 2)
return nn(n-1)+nn(n-2);
else
return 1;
}


怎么样分析这个函数.双重递归.请写个简单的流程.谢谢

斐波拉切数列。
[/Quote]

是的.看书上的题目.我看到第一个nn(n-1) 就开始递归了.越想越不明白.
saishow 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chinesedragon2010 的回复:]
我假如n=4,那么这个函数的调用流程如下:

1.因为n=4>2,所以执行return nn(n-1)+nn(n-2),也即return nn(3)+nn(2)。

2.接下来会调用“return nn(3)+nn(2)”的nn(3),而这个函数的返回值是多少呢?我们还不知道,还要继续递归,因为3>2,就是接着调用return nn(n-1)+nn(n-2),也即return nn(2)+……
[/Quote]


n=4时 返回的是3
是那一个步骤错了呢?
saishow 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ayw215 的回复:]
自己在纸上画图
[/Quote]

要怎么画呢?
chinesedragon2010 2010-08-07
  • 打赏
  • 举报
回复
我假如n=4,那么这个函数的调用流程如下:

1.因为n=4>2,所以执行return nn(n-1)+nn(n-2),也即return nn(3)+nn(2)。

2.接下来会调用“return nn(3)+nn(2)”的nn(3),而这个函数的返回值是多少呢?我们还不知道,还要继续递归,因为3>2,就是接着调用return nn(n-1)+nn(n-2),也即return nn(2)+nn(1)。那么nn(2)的返回值是多少呢?根据nn()函数体可知,因为n=2,而没有满足n>2,所以nn(2=1);同样的理解,我们可知nn(1)=1,所以return nn(2)+nn(1),也即return 2。

3.我们计算了nn(3)之后,接下来要调用“return nn(3)+nn(2)”这部分的nn(2),根据第2部的理解,我们知道nn(2)=2。

4.所以n=4时,nn(4)=nn(3)+nn(2)=(nn(3)+nn(2))+(nn(2)+nn(1))=(1+1)+(1+1)=4.
ayw215 2010-08-07
  • 打赏
  • 举报
回复
自己在纸上画图
十八道胡同 2010-08-07
  • 打赏
  • 举报
回复
如果是n=6呢?

n=6就是nn(6-1)+nn(6-2)
然后nn(6-1)在去调nn(6-1-1)+nn(6-1-2)
nn(6-2)在去调nn(6-2-1)+nn(6-2-2)

就这样一下调用下去直到n<=2
weixiaoshashou 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 saishow 的回复:]
C/C++ code
long nn(int n){
if (n > 2)
return nn(n-1)+nn(n-2);
else
return 1;
}


怎么样分析这个函数.双重递归.请写个简单的流程.谢谢
[/Quote]
斐波拉切数列。
saishow 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 csuxiaowu 的回复:]
比如:n=3,
1、n=3,它大于2,就做nn(n-1)+nn(n-2);然后调用的是nn(n-1),既是nn(2),这里2不大于2,返回了1
就是nn(n-1)=1,然后继续往下,变成1+nn(n-2);既是1+nn(1);nn(1)=1;所以变成1+1=2-------
[/Quote]
如果是n=6呢?
Csuxiaowu 2010-08-07
  • 打赏
  • 举报
回复
比如:n=3,
1、n=3,它大于2,就做nn(n-1)+nn(n-2);然后调用的是nn(n-1),既是nn(2),这里2不大于2,返回了1
就是nn(n-1)=1,然后继续往下,变成1+nn(n-2);既是1+nn(1);nn(1)=1;所以变成1+1=2-------

69,382

社区成员

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

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