【发布时间】:2020-08-25 01:52:16
【问题描述】:
请求:
使用 JavaScript,编写一个接受整数的函数。整数表示硬币被翻转的次数。仅使用递归策略,返回一个包含所有可能的掷硬币组合的数组。使用“H”表示正面,使用“T”表示反面。组合的顺序无关紧要。
例如,传入“2”将返回:
["HH", "HT", "TH", "TT"]
上下文:
我对 JavaScript 以及递归的概念都比较陌生。这纯粹是为了练习和理解,所以解决方法不一定要和我下面代码的方向相匹配;任何有用的方法或其他思考方式都是有帮助的,只要它是纯递归的(没有循环)。
尝试:
我的尝试一开始很简单,但是随着我增加输入,“动作”逐渐变得更加复杂。我相信这适用于 2、3 和 4 的输入。但是,5 或更高的输入在输出中缺少组合。非常感谢!
function coinFlips(num){
const arr = [];
let str = "";
// adds base str ("H" * num)
function loadStr(n) {
if (n === 0) {
arr.push(str);
return traverseArr();
}
str += "H";
loadStr(n - 1);
}
// declares start point, end point, and index to update within each str
let start = 0;
let end = 1;
let i = 0;
function traverseArr() {
// base case
if(i === str.length) {
console.log(arr);
return arr;
}
// updates i in base str to "T"
// increments i
// resets start and end
if(end === str.length) {
str = str.split('');
str[i] = "T";
str = str.join('');
i++;
start = i;
end = i + 1;
return traverseArr();
}
// action
let tempStr = str.split('');
tempStr[start] = "T";
tempStr = tempStr.join('');
if(!arr.includes(tempStr)){
arr.push(tempStr);
};
tempStr = tempStr.split('');
tempStr.reverse();
tempStr = tempStr.join('');
if(!arr.includes(tempStr)){
arr.push(tempStr);
};
tempStr = str.split('');
tempStr[end] = "T";
tempStr = tempStr.join('');
if(!arr.includes(tempStr)){
arr.push(tempStr);
};
tempStr = tempStr.split('');
tempStr.reverse();
tempStr = tempStr.join('');
if(!arr.includes(tempStr)){
arr.push(tempStr);
};
tempStr = str.split('');
tempStr[start] = "T";
tempStr[end] = "T";
tempStr = tempStr.join('');
if(!arr.includes(tempStr)){
arr.push(tempStr);
};
tempStr = tempStr.split('');
tempStr.reverse();
tempStr = tempStr.join('');
if(!arr.includes(tempStr)){
arr.push(tempStr);
};
// recursive case
start++;
end++;
return traverseArr();
}
loadStr(num);
}
coinFlips(5);
【问题讨论】:
标签: javascript recursion combinations coin-flipping