问一个递归执行顺序的问题

2017-10-18 09:12:15 +08:00
 waiaan
function fn1(){
fn1(); //(1)
fn2(); //(2)
}
大致这么一个顺序,请问是必须等(1)的递归执行完之后才会执行(2)吗?
谢谢。
3495 次点击
所在节点    JavaScript
28 条回复
JKeita
2017-10-19 09:51:07 +08:00
@waiaan 看出他不是循环调用,他是在递归调用 fn1 之前就执行 console.log 进行输出,所以不一样
waiaan
2017-10-19 10:56:26 +08:00
@JKeita


var inOrderTraverseNode = function (node, callback) {
if (node !== null) {
inOrderTraverseNode(node.left, callback); //( 1 )
callback(node.key);
inOrderTraverseNode(node.right, callback);
}
};

那这一段二叉树遍历的代码能否解释一下?为什么会等( 1 )递归结束了才开始执行后面的语句?实在没看懂,谢谢。
JKeita
2017-10-19 11:11:10 +08:00
@waiaan 这里需要画二叉树会看得比较清楚,每次进入父节点函数时先递归左分支,左分子递归结束返回后紧接着执行父节点的 callback 回调方法,最后递归右分支。你这个是二叉树的中序遍历,具体你网上查查图片会看得比较清楚
JKeita
2017-10-19 11:17:16 +08:00
@waiaan 为什么会等( 1 )递归结束了才开始执行后面的语句? 这里也是指 同级下执行顺序为 左,父,右
waiaan
2017-10-19 12:01:53 +08:00
@JKeita
18 楼和 22 楼的代码差别在哪?一个每次进入 fn1 都会执行后面的“ echo "fn1:$i done. \n";”,一个要等到 inOrderTraverseNode 递归结束才会执行后面的“ callback(node.key);”
多谢。
vankid
2017-10-19 13:16:24 +08:00
单线的,f1 退出后开始一个个反向执行 f2
JKeita
2017-10-19 14:02:30 +08:00
@waiaan 你还是没理解啊,并没有差别,同级下左分支 inOrderTraverseNode 执行完后必定会 callback(node.key);,你要把递归是从最深层次开始每层执行完后再返回上层继续执行,同一层次 必定 会 先后 执行 inOrderTraverseNode(left);callback;inOrderTraverseNode(right);
JKeita
2017-10-19 14:12:10 +08:00
@waiaan
https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=cda010f5f9deb48fef64a98c9176514c/79f0f736afc379313a0f0cbde1c4b74543a9113a.jpg
如图,为二叉树中序遍历,callback 函数即为输出节点名称,输出为:D J G B H E A F I C.
每个节点即为递归层次,输出顺序为:当前节点的左节点名称,当前节点名称,当前节点的右节点名称。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/398519

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX