关于递归 理解不能 求真相

hehesamalaile 2011-08-28 12:48:10
public void gui(int i){

if(i < 1){
return;
}


System.out.println("i== "+ i);
gui(i-1);
gui(i-1);
}

打印结果:
i== 5
i== 4
i== 3
i== 2
i== 1
i== 1
i== 2
i== 1
i== 1
i== 3
i== 2
i== 1
i== 1
i== 2
i== 1
i== 1
i== 4
i== 3
i== 2
i== 1
i== 1
i== 2
i== 1
i== 1
i== 3
i== 2
i== 1
i== 1
i== 2
i== 1
i== 1

完全找不到规则

如果只递归一个方法 就比较好理解
...全文
360 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang13967350367 2011-09-06
  • 打赏
  • 举报
回复
本人的一点愚见,说错莫喷
wang13967350367 2011-09-06
  • 打赏
  • 举报
回复
你可以把问题简单化,慢慢分析不难看出其中的规律
我们先考虑g(1) 是输出1的,
g(2) 211
g(3) 3211211
g(4) 432112113211211
g(5) 5432112113211211432112113211211
这样 G(5)就是5+2个G(4)
G(4)=4+2个g(3)
................
AndyZhang 2011-09-03
  • 打赏
  • 举报
回复
单步走一下
kjs008 2011-09-03
  • 打赏
  • 举报
回复
5
4 4
3 3 同左
2 2 2 2
1 1 1 1 1 1 1 1
如此美丽的你 2011-09-01
  • 打赏
  • 举报
回复
设一小点,单步跟踪一遍,是学习递归的不二法门、
querdaizhi 2011-09-01
  • 打赏
  • 举报
回复
画画就知道了
newerqiang 2011-08-31
  • 打赏
  • 举报
回复
看看、
gmemai 2011-08-31
  • 打赏
  • 举报
回复
比如说当i=5的时候,将要执行的代码如下:
System.out.println("i== "+ 5);
gui(4);
gui(4);
接下来呢?第一个gui(4)会继续执行,而它要执行的代码如下
System.out.println("i== "+ 4);
gui(3);
gui(3);
第一个gui(3)会继续执行,而它要执行的代码如下
System.out.println("i== "+ 3);
gui(2);
gui(2);
第一个gui(2)会继续执行,而它要执行的代码如下
System.out.println("i== "+ 2);
gui(1);
gui(1);
第一个gui(1)会继续执行,而它要执行的代码如下
System.out.println("i== "+ 1);
gui(0);
gui(0);
第一个gui(0)退出,第二个gui(0)退出,执行第二个gui(1),它要执行的语句如下:
System.out.println("i== "+ 1);
gui(0);
gui(0);
当两个gui(1)都退出的时候,就是要执行上面第二个gui(2)
nulls 2011-08-31
  • 打赏
  • 举报
回复
这个递归有点类似二叉树遍历
hehesamalaile 2011-08-31
  • 打赏
  • 举报
回复
等于3的时候 gui2又会执行二次 写错了 应该是gui1
hehesamalaile 2011-08-31
  • 打赏
  • 举报
回复
明白了一大半了

比如说gui(i-1) i = 5;
一共调5次
第二个gui2(i-1) 也是五次 出栈是1 2 3 4 5
等于1的时候 不执行gui1
等于2的时候 gui1又会执行一次 之后gui2出栈为1 执行1次
等于3的时候 gui2又会执行二次 之后gui2出栈为1 2 执行2次的时候 又会执行gui1
以此类推 gui2 为5的时候 gui1为4
不用debug看 完全搞不懂
算是找到点感觉了
ma123456aq 2011-08-30
  • 打赏
  • 举报
回复
学习了,谢谢
gmemai 2011-08-30
  • 打赏
  • 举报
回复
有点明白了,这个不是引用,所以i的值是不会改变的,结果每一个都是
gui(4);
4
gui(3);
3
gui(2);
2
gui(1);
1
gui(1);
1
gui(2);
2
gui(1);
1
gui(1);
1

gui(3);
3
gui(2);
2
gui(1);
1
gui(1);
1
gui(2);
2
gui(1);
1
gui(1);
1
gui(4);
4
gui(3);
3
gui(2);
2
gui(1);
1
gui(1);
1
gui(2);
2
gui(1);
1
gui(1);
1

gui(3);
3
gui(2);
2
gui(1);
1
gui(1);
1
gui(2);
2
gui(1);
1
gui(1);
1
justlovetao 2011-08-30
  • 打赏
  • 举报
回复
单步调试。一步一步跟着程序走。不要怕麻烦。走的几次你绝对会喜欢递归
峰行有你 2011-08-30
  • 打赏
  • 举报
回复
我也觉得有点难啊
codesnail 2011-08-29
  • 打赏
  • 举报
回复
递归可以理解为不听的跑同一段程序,但是栈在不断的变化。这样就不抽象了。
kenyyy 2011-08-29
  • 打赏
  • 举报
回复
画一棵二叉树就知道了
NewSilen 2011-08-29
  • 打赏
  • 举报
回复
支持
楼主看这个挺好

i==2
i==1 -->gui(1)
i==1
都是一起出现的 他们就是gui(2)
你如果换成gui(2) 会发现
i==3
gui(2)
gui(2)
又是一起出现的 他们是gui(3)。这是倒推,正推差不多

[Quote=引用 2 楼 xibeitianlang 的回复:]
Delphi(Pascal) code

i== 5
i== 4 i== 4
i== 3 i== 3 i== 3 i== 3
i== 2 i== 2 i== 2 i== 2 i== 2 i== 2 i== 2 i== 2
i== 1 i== 1 i== 1 i== 1 i=……
[/Quote]
竞天问 2011-08-28
  • 打赏
  • 举报
回复
理解递归没有别的好方法,就是自己亲手执行代码,一层层递归进去,再跳出来
wwai168 2011-08-28
  • 打赏
  • 举报
回复
学习了
加载更多回复(3)

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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