加拿大华人论坛 温哥华 Vancouver如何用递归,逆序一个栈?



在加拿大


递归里面递归,我看懵了,请大家帮我解释一下吧代码:public class ReverseAStackByRecursion { public static void reverse(Stack stack) { if (stack.isEmpty()) { return; } int last = getAndRemoveTheLastElement(stack); reverse(stack); stack.push(last); } private static int getAndRemoveTheLastElement(Stack stack) { int result = (int) stack.pop(); if (!stack.isEmpty()) { int last = getAndRemoveTheLastElement(stack); stack.push(result); return last; } return result; }}

评论
这个是经典入门级的stack operation吧,一般大学data structure应该都有系统练过的。其实思想很简单,就是两步,第一步,从stack popup一个东西,第二步,把这个东西push到这个stack其他东西的下面,如此类推,直到所有东西逆序了。再说说递归这个方法recursive call, 实际工程中运用不太多的,为啥,因为太凹了,难以理解,一旦搞错找不到出口,就无线循环下去了。我自己是不太喜欢这种看似优雅实则容易出错的方式。当然,递归的有点也很明显,就是减少代码量,代码精简优雅,不过代价是暂时性的堆积内存的消耗,因为每个函数调用都要在heap里分配memory,后面函数不退出前前面函数的memory是不会被release的。

评论
就这个例子,还有一点可能会容易误解的地方,就是reverse函数的最后一个方法stack.push(last); 这其实是递归函数reverse里边一堆函数调用返回后的最后一步,就是把原stack最后一个变量压进现stack的第一个位置,完成一个递归过程。

评论
dennistan2009 说:就这个例子,还有一点可能会容易误解的地方,就是reverse函数的最后一个方法stack.push(last); 这其实是递归函数reverse里边一堆函数调用返回后的最后一步,就是把原stack最后一个变量压进现stack的第一个位置,完成一个递归过程。点击展开...popStack.pop()在递归过程中弹出来的所有数值,都是暂存在内存堆栈,然后再依次压入pushStack的吧?

评论
小小清风 说:public reverse 走第一遍的时候 走到 int last 那里,last=1,然后 reverse(stack)走第二遍 last=2,reverse 都走完 ,last顺序就是12345,stack.push 的顺序就是54321那个getAndremove,走第一遍的时候return last=1,然后stack.push(result) 把2345重新压回去。 走第二遍,last=2,把345重新压回去点击展开...谢谢,我需要的就是这几句“那个getAndremove,走第一遍的时候return last=1,然后stack.push(result) 把2345重新压回去。 走第二遍,last=2,把345重新压回去”

评论
小小清风 说:public reverse 走第一遍的时候 走到 int last 那里,last=1,然后 reverse(stack)走第二遍 last=2,reverse 都走完 ,last顺序就是12345,stack.push 的顺序就是54321那个getAndremove,走第一遍的时候return last=1,然后stack.push(result) 把2345重新压回去。 走第二遍,last=2,把345重新压回去点击展开...我爱你,解释得透彻,完全懂了

评论
gongbao你这少上论坛多在家练习啊

评论
A brave new world gongbao你这少上论坛多在家练习啊点击展开...嗯 您说得对,我老忍不住上家园论坛看看

评论
要深刻理解递归,可以学学prolog或者erlang,没有循环语句,只有递归,赫赫

评论
这是大二数据结构课程里的习题

评论
西葡那些事儿 (2011)意大利中北部之旅 (2009)美东四城记(波、纽、华、费)(2010)墨西哥城都市游 (2012)邮轮入门级-巴哈马 (2016)这是大二数据结构课程里的习题点击展开...我编程基础不好

评论
agent1234 说:要深刻理解递归,可以学学prolog或者erlang,没有循环语句,只有递归,赫赫点击展开...学过点erlang,到otp放弃

评论
其实看懂这代码不需要上过数据结构,就这么几行

 ·加拿大房产 大蒙特利尔 - 出租靠近DT河边安静美景新交房studio近地铁绿线
 ·中文新闻 曾希望在 NBA 打球的篮球教练被控强奸 14 岁女孩,他在 Snapchat
·中文新闻 P&O 游轮:为什么澳大利亚护士 Corrine McIvor 再也不会去游轮度

温哥华 Vancouver-加拿大

这种像栗子的东西是什么?

华人网这种像栗子的东西好像不是栗子,我尝了一口,发苦。街上经常见到,落得满地都是。 评论 [FONT=宋体] [/FONT] 超赞 赏 反馈:森林之歌 N NONADAGuest 0$(VIP ) 2011-11-12#2 回复: 这种像栗子的东西 ...

温哥华 Vancouver-加拿大

原来联合早报也是大外宣

华人网评论 意见不保证正确,但感受保证真实 超赞 赏 反馈:chong.ca 0.01 密 密林深处 9$(VIP 0,#106) 1,6932022-08-14#2 有钱能使鬼推磨,媒体人也是人,给他们钱,让他们做什么都可以。 评论 Dayday- ...

温哥华 Vancouver-加拿大

王局太太太NB了

华人网强烈推荐! 评论 意见不保证正确,但感受保证真实 超赞 赏 反馈:happyhappy2019, 荣耀, tony 和 3 其他人 0.03 L LINDA 论坛 0$(VIP 0,#437) 4272022-05-22#2 谢谢分享! 评论 Dayday-up 说:强烈推荐!点击展 ...

温哥华 Vancouver-加拿大

求助急: 税务局付款

华人网刚才网上提交怎么出现付款的链接,我就到银行网站付,可是在GRA amount owing下面有一个Account number 9 位数的是指自己的SIN号吗?急 评论 不好意思,搞定了。 评论 搞定了就分享一下啊。 ...

温哥华 Vancouver-加拿大

想买笔记本电脑

华人网现在用的事联想thinkpad,I-5处理器,内存小,启动多个程序的时候慢,尤其是用微软的软件的时候。看到ACER I-7处理器的电脑在百斯百上一千出头儿,心里痒痒,想在网上下单,去高贵林 ...