Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 字符串排列时的递归问题_Javascript_Recursion - Fatal编程技术网

Javascript 字符串排列时的递归问题

Javascript 字符串排列时的递归问题,javascript,recursion,Javascript,Recursion,我试图生成字符串的所有大写置换 例如: 大写术语(word)-给定一个字母字符串,返回所有 该单词的大写字母和小写字母的可能组合 例如:“abc” 输出:['abc''abc''abc''abc''abc''abc''abc''abc''abc''abc'] 以迭代和递归的方式实现这一点 这是我的尝试: 函数大写术语(word){ const res=新集合(); //先按实际单词。 决议添加(word); 助手(单词,res,); 返回res; 函数助手(word、res、str=''){

我试图生成字符串的所有大写置换

例如:

大写术语(word)-给定一个字母字符串,返回所有 该单词的大写字母和小写字母的可能组合

例如:“abc”

输出:['abc''abc''abc''abc''abc''abc''abc''abc''abc''abc']

以迭代和递归的方式实现这一点

这是我的尝试:

函数大写术语(word){
const res=新集合();
//先按实际单词。
决议添加(word);
助手(单词,res,);
返回res;
函数助手(word、res、str=''){
if(str.length==word.length)返回;
const len=单词长度;
决议添加(word);
//资本化
for(设i=0;ilog(capitalPermutations(testWord1))
您可以使用一个递归函数,该函数获取上次访问的索引中收集的字母,并检查收集的字母字符串是否与给定的字符串具有相同的长度。然后将字符串推送到结果集

键是递归的双重调用,带有小写字母和大写字母

函数大写术语(word){
函数iter(温度=“”){
如果(临时长度===字长){
结果:推送(温度);
返回;
}
iter(temp+word[temp.length].toLowerCase());
iter(temp+word[temp.length].toUpperCase());
}
var结果=[];
iter();
返回结果;
}

console.log(大写术语('abc'))像二叉树一样遍历字符串

const permute=(str,前缀=“”)=>{
const idx=prefix.length
if(idx==str.length)
返回[前缀]
const lower=str[idx].toLowerCase()
const upper=str[idx].toUpperCase()
return[…排列(str,前缀+下限),…排列(str,前缀+上限)]
}

console.log(permute('abc'))
这里有一个带有flatMap的:

函数f(str){
返回str?f(str.slice(1)).flatMap(sfx=>
[str[0].toLowerCase()+sfx,str[0].toUpperCase()+sfx]):[“”]
}
console.log(JSON.stringify(f(“abc”))
迭代:

函数f(str){
让res=[“”]
for(让c代表str)
res=res.flatMap(pfx=>
[pfx+c.toUpperCase(),pfx+c.toLowerCase()]
返回res
}

console.log(JSON.stringify(f(“abc”))
@kmgt它没有什么问题,这就是递归实际上的好处——它不容易通过迭代实现。赋值很混乱。这实际上与排列无关,排列与排序有关。“如果有人能纠正我的错误,我将不胜感激”-你能解释一下你到底要去哪里吗?我根本不明白你的方法。为什么要迭代单词长度,并从中获取所有前缀?你为什么要做
str+=substr
?在基本情况下,您是想与原始的
word
s长度(传递给
capitalPermutations
的长度)进行比较,还是与递归调用中传递的
word
进行比较?为什么在每个递归步骤中将
word
添加到
res
ult中,而不是在最后添加一次?@Bergi感谢您的评论。我使用
str
来跟踪我正在处理的字符串数量。我理解我的代码令人困惑(只是想学习!)感谢您的帮助和所有评论。在我的基本情况下,我希望与我原来的字长(不是通过的字长)相比,我的坏!生成所有置换是否会产生字符串,如
cab
bac
等。?这项作业不只是关于生成所有不同的套管吗?谢谢。秀干净!如果我以迭代的方式做这件事,我会怎么做?我正在考虑使用两个for循环,在其中一个循环中使用substring?这也适用于“abcde”,因此这似乎是一个很好的解决方案。^^这就是我如此喜欢的原因@技术角。对于迭代方法,您需要两个循环,一个用于单词的字符,另一个用于部分结果。请看编辑。这是一个打字错误。让我来解决这个问题。这是正确的答案