由“递归遍历二叉树”引发的思考
递归的用法我感觉自己已经掌握了,可是今天在递归遍历二叉树时,它又迷一样令我费解。我本人在算法这一块很薄弱,所以想把这个问题发出来,希望有大神能够为我解答;同时也希望能帮助到那些对“递归”一知半解的朋友。
蜜桃猫镇楼 (ง •_•)ง
首先创建一个对象
//创建一个对象var obj = { key:1, next: { key: 2, next: { key: 3, next: { key: 4, next: { key: null next: null } } } }}复制代码
然后递归输出key
//递归输出keyfunction Recursion(obj) { if(obj.next !== null) { console.log(obj.key) //1 Recursion(obj.next) //2 }}Recursion(obj)复制代码
至此一个非常正经的递归就实现了,浏览器里面输出1,2,3,4
,非常好理解,但是把//1和//2调换下位置,像下面这样
将上面代码1和2交换位置
//递归输出keyfunction Recursion(obj) { if(obj.next !== null) { Recursion(obj.next) //2 console.log(obj.key) //1 }}Recursion(obj)复制代码
我惊奇的发现...key的输出顺序反了,变成4,3,2,1
,为什么会这样呢?于是我在Chrome里面设置断点调试,过程如下
1.传入obj对象
2.此时obj不为空,key为1,next指向2,控制台没有输出信息 3.此时obj不为空,key为2,next指向3,控制台没有输出信息 4.此时obj不为空,key为3,next指向4,控制台没有输出信息 5.此时obj不为空,key为4,next指向null,控制台没有输出信息 6.此时obj不为空,key为null,next为null,控制台没有输出信息 7.序继续往下执行 然后我就发现console.log(obj.key)
执行了四次!!依次打印出 4,3,2,1
,为什么会这样??它不应该执行一次后就直接结束了吗?这里我一直想不通。我有一个猜测就是可能每次递归调用的时候,浏览器将函数压入栈中才导致输出结果反转的。至于 console.log(obj.key)
为什么会执行四次,我就想不通了,希望有懂的朋友不吝赐教~ 我表达的可能不是很清楚,大家可以把这两段代码放到本地执行看看;
我的问题就是 1.为什么console.log(obj.key)
执行了四次?是什么原因导致的~~~~