Javascript 字符串排列时的递归问题
我试图生成字符串的所有大写置换 例如: 大写术语(word)-给定一个字母字符串,返回所有 该单词的大写字母和小写字母的可能组合 例如:“abc” 输出:['abc''abc''abc''abc''abc''abc''abc''abc''abc''abc'] 以迭代和递归的方式实现这一点 这是我的尝试: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){
const res=新集合();
//先按实际单词。
决议添加(word);
助手(单词,res,);
返回res;
函数助手(word、res、str=''){
if(str.length==word.length)返回;
const len=单词长度;
决议添加(word);
//资本化
for(设i=0;i log(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”,因此这似乎是一个很好的解决方案。^^这就是我如此喜欢的原因@技术角。对于迭代方法,您需要两个循环,一个用于单词的字符,另一个用于部分结果。请看编辑。这是一个打字错误。让我来解决这个问题。这是正确的答案