我在网上查询了此结果,但结果不多,因为很难用几句话来形容.
基本上,我需要一个函数,例如puntil,它接受参数字符串.基本上,函数排列直到字符串等于参数为止.
例如,如果您运行puntil(‘ab’),则应在函数内部执行:
一种
b
C
d
Ë
F
G
H
一世
Ĵ
ķ
升
米
ñ
Ø
p
q
[R
s
Ť
ü
v
w
X
ÿ
ž
a
Ab!比赛
另一个例子,对于puntil(‘abcd’)
一种
b
C
d
Ë
F
G
H
一世
Ĵ
ķ
升
米
ñ
Ø
p
q
[R
s
Ť
ü
v
w
X
ÿ
ž
a
b
交流电
广告
e
f
g
啊
i
j
ak
人
上午
一个
o
ap
水
AR
如
在
au
影音
w
斧头
y
z
…等等等等
直到匹配abcd.
基本上是无限排列直到匹配.
有任何想法吗?
解决方法:
这是fiddle
var alphabet = ['a','b','c'];//,'d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
var output = "";
var match = "cccc"; //<----------- match here
//This is your main function
function permutate() {
var d = 0; // d for depth
while (true) {
//Your main alphabet iteration
for (var i=0; i<alphabet.length; i++){
//First level
if (d === 0) {
console.log(alphabet[i])
output = alphabet[i];
}
else
iterator(alphabet[i], d); //Call iterator for d > 0
if (output === match)
return;
}
d++; //Increase the depth
}
}
//This function runs n depths of iterations
function iterator(s, depth){
if (depth === 0)
return;
for (var i=0; i<alphabet.length; i++){
if (depth > 1)
iterator(s + alphabet[i], depth - 1)
else {
console.log(s + alphabet[i]);
output = s + alphabet[i];
}
if (output === match)
return;
}
};
说明:
您的程序需要遍历这样的字母树
[a]
-[a]
-[a]
-[a]...
-[b]...
[b] ...
-[b] -
-[a]...
-[b]...
[b] - ...
[c] - ...
如果不需要您首先完成每个深度的要求,则可以通过常规递归函数轻松完成此操作.
因此,我们需要一个特殊的迭代器(深度)函数,该函数可以执行请求的嵌套迭代次数(深度).
因此main函数可以调用深度增加的迭代器(d).
就这样!!
警告:这只是一个原型.这可以进行优化和改进.它使用全局变量来简化演示.您的真实程序应避免使用全局变量.如果匹配字太长,我还建议在setTimeout中调用iterator().
n个深度只能受您的资源限制.