Javascript 在递归函数中,结果存储在哪里?
我目前正试图让JavaScript为布尔函数生成一个真值表。给定一个函数,代码应该只列出所有可能的布尔组合,并从每个组合中输出函数 至于生成所有组合,我将其放在一起简化为组合代码:Javascript 在递归函数中,结果存储在哪里?,javascript,arrays,recursion,boolean,return-value,Javascript,Arrays,Recursion,Boolean,Return Value,我目前正试图让JavaScript为布尔函数生成一个真值表。给定一个函数,代码应该只列出所有可能的布尔组合,并从每个组合中输出函数 至于生成所有组合,我将其放在一起简化为组合代码: var table = []; function combinations(current) { var current = current || []; if(current.length === 3) { table.push(current); } else {
var table = [];
function combinations(current) {
var current = current || [];
if(current.length === 3) {
table.push(current);
} else {
var c = copy(current);
c.push(true);
combinations(c);
c = copy(current);
c.push(false);
combinations(c);
}
}
function copy(a) {
var r = [];
for(var i = 0; i < a.length; i++) r.push(a[i]);
return r;
}
combinations(); // now table consists of each pair of 3 boolean values
所以基本上,当它达到一个组合,即current.length==3时,它将结果记录推送到表中。然而,我想知道这是否是存储递归函数结果的推荐方法
我面临在递归函数中使用return的建议,但是如何实现这样的事情呢?也就是说,如果最终的组合必须返回一个包含所有元素的数组,那么如何实现呢?当然,我可以在最后使用return table,但实际上我正在寻找一种在函数内部完成这一切的方法,而不需要像现在这样的外部变量
那么,如何使组合以数组形式返回结果而不使用外部变量?为了避免污染全局空间,可以使用闭包来包含递归函数。这个概念在。中有一篇很好的文章,为了避免污染全局空间,您可以使用闭包来包含递归函数。在。使用中有一篇关于这个概念的优秀著作 要优雅得多,不是吗 使用 要优雅得多,不是吗
我觉得你目前的解决办法很好。它可能不是最优雅的,但它很简单,并且可以完成任务唯一难看的部分是硬编码的3-您应该将其转换为参数 你真正的问题似乎比Javascript更不懂语言。如果您希望函数返回组合,那么您可以完全这样做,只需清楚地记住您的函数应该返回什么,并编写基本情况和递归情况:
function combinations(domain, n){
//returns a list of combinations of length `n` with elements from `domain`
if(n <= 0){
return [[]]; //the empty combination is the only solution
}else{
var small_combs = combinations(domain, n-1);
var big_combs = [];
for(var i=0; i<domain.length; i++){
for(var j=0; j<small_combs.length; j++){
big_combs.push(small_combs[j].concat(domain[i]))
}
}
return big_combs;
}
}
table = combinations([true, false], 3);
我觉得你目前的解决办法很好。它可能不是最优雅的,但它很简单,并且可以完成任务唯一难看的部分是硬编码的3-您应该将其转换为参数 你真正的问题似乎比Javascript更不懂语言。如果您希望函数返回组合,那么您可以完全这样做,只需清楚地记住您的函数应该返回什么,并编写基本情况和递归情况:
function combinations(domain, n){
//returns a list of combinations of length `n` with elements from `domain`
if(n <= 0){
return [[]]; //the empty combination is the only solution
}else{
var small_combs = combinations(domain, n-1);
var big_combs = [];
for(var i=0; i<domain.length; i++){
for(var j=0; j<small_combs.length; j++){
big_combs.push(small_combs[j].concat(domain[i]))
}
}
return big_combs;
}
}
table = combinations([true, false], 3);
不需要使用此构造来封装结果。请参阅我的答案。我将使用改为可用于表示这只是一个选项。@jsumners链接为dead@Dropout我喜欢人们重新组织而不创建302。不需要使用这个结构来封装结果。请参阅我的答案。我将使用改为可用于表示这只是一个选项。@jsumners链接为dead@Dropout我喜欢人们重新组织而不是创造302。谢谢。不过有些反馈-你在j循环中检查i。另外,在JavaScript中int不存在,arr+arr不可能,但我理解你的意思。谢谢。不过有些反馈-你在j循环中检查i。另外,在JavaScript中int不存在,arr+arr不可能,但我理解你的意思。
var id = { "object": "page", "entry": [{ "id": "1588811284674233", "time": 1511177084837, "messaging": [{ "sender": { "id": "1393377930761248" }, "recipient": { "id": "1588811284674233" }, "timestamp": 1511177084553, "message": { "mid": "mid.$cAAX_9pLcfu1mCnGmiVf2Sxd2erI2", "seq": 1882, "text": "a" } }] }] };
function getKey(obj, data) {
var data = data || [];
if (obj) {
var keys = Object.keys(obj);
for (var pos in keys) {
console.log();
data.push(keys[pos]);
if ((obj[keys[pos]].constructor === Array)) {
for (var i = 0; i < obj[keys[pos]].length; i++) {
getKey(obj[keys[pos]][i], data);
}
}
else if (obj[keys[pos]].constructor === Object) {
getKey(obj[keys[pos]], data);
}
}
return data;
}
}