我目前正试图让JavaScript为布尔函数生成真值表。给定一个函数,代码应该只列出所有可能的布尔组合,并使用每个组合的函数输出。
至于生成所有组合,我把它放在一起(仅简化为组合代码):
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
)时,它会将结果记录推送到table
。但是,我想知道这是否是存储递归函数结果的推荐方法。
我面临在递归函数中使用return
的建议,但是如何实现这样的事情 - 即,如果最后combinations
必须返回包含所有元素的数组,那么有可能这样做吗?当然,我最后只能使用return table
,但实际上我正在寻找一种在函数内部完成所有操作的方法,而不需要像现在这样的外部变量。
那么,如何让combinations
在不使用外部变量的情况下将结果作为数组返回?
答案 0 :(得分:4)
function combinations(current) {
var current = current || [];
if(current.length === 3) {
return [current];
} else {
return combinations(current.concat(true)).concat(combinations(current.concat(false)));
}
}
var table = combinations(); // now table consists of each pair of 3 boolean values
console.log(table);
更优雅,没有?
的 Demo → 强> 的
答案 1 :(得分:2)
为避免污染全局空间,可以使用闭包来包含递归函数。在http://drewwells.net/blog/2010/recursion-in-javascript/处有一个很好的关于这个概念的文章。
答案 2 :(得分:1)
您当前的解决方案对我来说似乎没问题。它可能不是最优雅的,但它很简单并完成工作(唯一丑陋的部分是硬编码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 :(得分:0)
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;
}
}