【发布时间】:2016-08-23 04:39:51
【问题描述】:
我正在尝试理解递归,并且我对它的直观工作方式有一定的了解,但是返回数据的聚合是我遇到的问题。
例如,在 javascript 中为了展平一个数组,我想出了以下代码:
var _flatten = function(arr){
if(!arr instanceof Array) return arr;
var g = [];
function flatten(arr){
for(var i = 0; i < arr.length;i++){
if(arr[i] instanceof Array){
flatten(arr[i]);
}else{
g.push(arr[i]);
}
}
}
flatten(arr);
return g;
}
像这样转
var list = [1,2,3,4,5,6,[1,2,3,4,5,[1,2,3],[1,2,3,4]]];
进入这个:[ 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 1, 2, 3, 1, 2, 3, 4 ]
这很好,但全局变量 g 似乎是某种廉价的黑客行为。我不知道如何考虑到达堆栈顶部时返回的结果以及沿堆栈向下传播的函数的返回。你将如何实现这个功能,我怎样才能更好地掌握这一点?
谢谢!
【问题讨论】:
-
检查
java标签,java不是javascript -
对于这样的复杂递归,我会简化问题(使其更小),而不是使用
[1,2,3,4,5,6,[1,2,3,4,5,[1,2,3],[1,2,3,4]]],您可以像[1,2,[1,2,3]]那样简化它,然后从那里尝试了解这里的递归工作。 -
g不是全局的,在 JavaScript 中使用闭包是一种非常好的方法。 -
抱歉,我的意思是函数的全局变量,并且在每次迭代时都会重新初始化的 for 循环之外。
-
要正确理解递归,please refer to this question.
标签: javascript recursion