我有一个javascript函数,它接受一个字符串并打乱字母:
function scramble(a){
a=a.split("");
for(var b=a.length-1;0<b;b--){
var c=Math.floor(Math.random()*(b+1));d=a[b];a[b]=a[c];a[c]=d;
}
return a.join("")
}
问题是,有时它输出的值与输入的值相同。如果我对"TREE"进行解码,结果可能是"TREE"。如果输出与输入没有不同,我如何在输出之前检查并再次运行函数?
谢谢!布伦丹
您可以使用递归并再次调用函数,直到您知道返回的不是开始时的字符串。旁注:您的洗牌创建了一个全局变量d
。当声明一个新变量时,尝试使用var
。
EDIT:正如user3297291所建议的那样,应该检查以确保输入至少有2个字符长,并且不仅仅是重复字符串的整个长度的相同字符。否则,我们将被置于一个无限循环中。
function scramble(a){
if (a.length < 2 || isAllRepeats(a))
return a;
var b = a.split("");
for(var i = b.length - 1; 0 < i; i--){
var c = Math.floor(Math.random()*(i+1));
var d=b[i];b[i]=b[c];b[c]=d;
}
var newString = b.join("");
if (newString === a)
return scramble(newString);
return newString;
}
function isAllRepeats(a) {
var first = a[0];
var isRepeats = true;
a.split('').forEach(function(letter) {
if (letter != first)
isRepeats = false;
});
return isRepeats;
}
console.log(scramble("TREE"))
console.log(scramble("A"))
console.log(scramble("AAAAA"))
使用递归,在函数结束时,检查输出是否等于输入,如果是则return scramble(a);
,如果不是则return scrambled_text;
我也建议重命名你的变量更容易读,我上面的例子返回语句假设你已经重命名了变量,无论你的打乱文本存储在什么变量中,我都称之为scrambled_text
递归方法是想到的,因此你可能会这样做;然而,概率是一种奇怪的东西,总是有(尽管非常非常非常罕见)被"鱼"困住的可能性。
function scramble(s){
function shuffle(a){
var i = a.length,
j,
tmp;
while (i > 1) {
j = Math.floor(Math.random()*i--);
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
return a;
}
var t = shuffle([...s]).join("");
return t === s ? scramble(s) : t;
}
console.log(scramble("fish"))