我写了两段代码,我想它们应该一样工作。您可能会注意到,两者之间唯一不同的是for循环的声明。
为什么带有for-in的代码无法按预期运行?
谢谢。
const allPermutations1 = s => {
let permutations = []
const recursion = (s, p = '') => {
if (s.length === 0) return permutations.push(p)
for (let i = 0; i < s.length; i++)
recursion(s.slice(0, i) + s.slice(i+1), p + s[i])
}
return (recursion(s), permutations)
}
allPermutations1('123') // ["123", "132", "213", "231", "312", "321"]
const allPermutations2 = s => {
let permutations = []
const recursion = (s, p = '') => {
if (s.length === 0) return permutations.push(p)
for (let i in s)
recursion(s.slice(0, i) + s.slice(i+1), p + s[i])
}
return (recursion(s), permutations)
}
allPermutations2('123') // ["123", "132", "21", "312", "321"]
答案 0 :(得分:2)
一个for...in
循环遍历键并返回一个字符串。在接头内应用i+1
迭代器时,您将返回字符串串联而不是递增值。例如,'1' + '2'
是'12'
而不是3
。正确拼接数字时,这种情况可能会导致问题。您需要将密钥解析为数字才能执行预期的操作。
答案 1 :(得分:1)
const allPermutations2 = s => {
let permutations = [];
const recursion = (s, p = "") => {
if (s.length === 0) return permutations.push(p);
for (let i in s) {
recursion(
s.slice(0, parseInt(i)) + s.slice(parseInt(i) + 1),
p + s[parseInt(i)]
);
}
};
return recursion(s), permutations;
};
将产生与第一个相同的结果。当您为..输入时,键是字符串。