重复加扰功能,直到输出与输入不同

时间:2016-11-14 16:26:35

标签: javascript arrays function

我有一个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("")
}

问题是,有时它会输出与输入相同的值。如果我解读&#34; TREE&#34;它可能会出现&#34; TREE&#34;。 如果输出与输入不同,如何在输出之前检查并再次运行功能?

谢谢! 布伦丹

3 个答案:

答案 0 :(得分:1)

你可以使用递归并再次调用你的函数,直到你知道你没有返回你开始使用的相同字符串。旁注:您的改组会创建一个全局变量d。在判断新变量时尝试使用var

编辑:根据user3297291的建议,应该进行检查以确保输入的长度至少为2个字符,并且不会重复相同的字符字符串的整个长度。否则,我们将处于无限循环中。

&#13;
&#13;
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"))
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用递归,在函数结束时,检查输出是否等于输入,如果是,则return scramble(a);如果不是return scrambled_text;

我还建议将变量重命名为更具可读性,上面的示例return语句假设您已重命名变量,并且您的加扰文本存储的变量是我所称的scrambled_text

答案 2 :(得分:0)

递归方法是想到的,因此你可能会做如下事情;然而概率是奇怪的,并且总是(尽管非常非常罕见)被卡住了#34;

&#13;
&#13;
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"))
&#13;
&#13;
&#13;