加拿大华人论坛 温哥华 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放弃
评论
其实看懂这代码不需要上过数据结构,就这么几行
·新西兰新闻 “对中国没有信心!”NZ邻国爆发抗议,“既要又要”!新西兰
·新西兰新闻 奥克兰昨夜发生两起致命事故,两人死亡!