鱼C论坛

 找回密码
 立即注册
查看: 2925|回复: 16

求助关于递归逻辑的问题

[复制链接]
发表于 2014-8-16 20:25:35 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 大条鱼 于 2014-8-18 11:22 编辑
  1. def aa(x,y):
  2.     if y==1:
  3.         return 1
  4.     else:
  5.         return x+aa(x,y-1)
  6.    
  7. print(aa(5,6))
复制代码

以上是一段典型的递归代码,

代码里写的是当最后Y==1时,返回数字1,并且退出函数,
那么按照逻辑上的顺序来讲,应该是在最后退出时,返回的结果是1才对,


请问,为什么会返回其他值?、。
  1. def aa(y):
  2.     if y==1 or y==2:
  3.         return 1
  4.     else:
  5.         return aa(y-1)+aa(y-2)
  6. print(aa(10))
复制代码
或者谁能帮我描述下上面这个代码的逻辑顺序??



希望有高手能告诉我里面的逻辑顺序,,非常感谢!



最佳答案

查看完整内容

图片里给画出了你的程序的逻辑关系,我把程序的递归加了一些输出,看输出能更清楚的看出来递归的过程 #include int aa(x,y) { int all; printf("现在我要求aa(%d,%d)\n",x,y); if(y == 1) { printf("因为y是1,所以可以返回1了\n"); return 1; } else { printf("因为y不是1,所以得先求出aa(x,y-1)\n"); all = x + aa(x,y-1); printf("aa(%d,%d) 已经求出来了,所以aa(%d,%d) =%d + %d = %d,可 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-16 20:25:36 | 显示全部楼层
图片里给画出了你的程序的逻辑关系,我把程序的递归加了一些输出,看输出能更清楚的看出来递归的过程
#include<stdio.h>
int aa(x,y)
{
        int all;
        printf("现在我要求aa(%d,%d)\n",x,y);
        if(y == 1)
        {
                printf("因为y是1,所以可以返回1了\n");
                return 1;
        }
        else
        {
                printf("因为y不是1,所以得先求出aa(x,y-1)\n");
                all =  x + aa(x,y-1);
                printf("aa(%d,%d) 已经求出来了,所以aa(%d,%d) =%d + %d = %d,可以返回这个值了\n",x,y-1,x,y,x,all - x,all);
                return all;
        }
}
int main()
{
        int x;
        x = aa(5,6);
        printf("%d\n",x);
        return 0;
}

逻辑图

逻辑图

评分

参与人数 1荣誉 +3 鱼币 +5 贡献 +2 收起 理由
bevin + 3 + 5 + 2 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-16 20:32:56 | 显示全部楼层
本帖最后由 大条鱼 于 2014-8-16 20:34 编辑

return x+aa(x,y-1)

还有这一句,我并没有在ELSE里为函数设定其他的返回值,那么在不包含X
+时,AA(X,Y-1)的返回值应该是多少?
重复调用,应该是调用返回值才对,但我并没有给AA设返回值,

为什么结果却是显示26,

希望有高手告诉我里面的逻辑,非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-16 22:34:09 From FishC Mobile | 显示全部楼层
Y==1是递归的终止条件,aa(x,1)的返回值是1 aa(x,2)的返回值是x+aa(x,1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-16 23:34:27 | 显示全部楼层
把第五行的x+ 去掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-17 03:42:41 | 显示全部楼层
楼上解释正确,楼主看清楚return关键字,整个流程跑完是发生了6次return,从最底层往上把之前每层已知的5累加。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-18 11:10:01 | 显示全部楼层
哆拉b梦 发表于 2014-8-16 23:38
图片里给画出了你的程序的逻辑关系,我把程序的递归加了一些输出,看输出能更清楚的看出来递归的过程
#inc ...

这位兄台,你写的代码不是PYTHON语言,看不懂!

只能对图片一知半解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-18 11:14:13 | 显示全部楼层
  1. def aa(y):
  2.     if y==1 or y==2:
  3.         return 1
  4.     else:
  5.         return aa(y-1)+aa(y-2)
  6. print(aa(10))
复制代码


或者谁能帮我描述下上面这个代码的逻辑顺序??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-18 12:18:25 | 显示全部楼层
aa(10)

aa(9)+aa(8)

aa(8)+aa(7)+aa(7)+aa(6)

aa(7)+aa(6)+aa(6)+aa(5)+aa(6)+aa(5)+aa(5)+aa(4)

……

1+1+1+……+1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-18 13:29:12 | 显示全部楼层

非常感谢,不过还是无法理解你写的是什么意思!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-18 15:52:01 | 显示全部楼层
大条鱼 发表于 2014-8-18 13:29
非常感谢,不过还是无法理解你写的是什么意思!!

就是说呢  
第10层递归的最终结果是 1
第9层递归的结果就是x + 第十层结果  = x+1
第8层递归的结果就是x+  第九层结果  = x+x+1

以此类推  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-18 16:18:14 | 显示全部楼层
墙角君 发表于 2014-8-18 15:52
就是说呢  
第10层递归的最终结果是 1
第9层递归的结果就是x + 第十层结果  = x+1

如果只是X+AA(y)的话还可以理解,
就是
return aa(y-1)+aa(y-2)
这个不能理解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-18 17:58:12 | 显示全部楼层
确实不会 来学习下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-18 20:59:09 | 显示全部楼层
这个是相当于数学数列里的An=A(n-1)+A(n-2)么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-19 13:43:52 | 显示全部楼层
大条鱼 发表于 2014-8-18 16:18
如果只是X+AA(y)的话还可以理解,
就是
return aa(y-1)+aa(y-2)

return就是让函数返回aa(y-1)+aa(y-2)的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-20 02:22:45 | 显示全部楼层
大条鱼 发表于 2014-8-18 16:18
如果只是X+AA(y)的话还可以理解,
就是
return aa(y-1)+aa(y-2)

一样的推
最后一层返回是1
然后 加上上一层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-22 20:37:49 | 显示全部楼层
看不懂!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-5 22:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表