Javascript:使用for循环和子字符串的递归函数示例 - 无法弄清楚我出错的地方

时间:2014-02-11 23:17:30

标签: javascript for-loop recursion substr

我目前正致力于coderbyte的媒体挑战,名为“排列步骤”。

目标是获取用户输入num,并使用相同的数字返回下一个大于num的数字因此,例如,如果用户输入为123,那么数字132应为回。如果用户输入为12453,则应返回12534 ...

Anywho,我有一个正确的模型答案由某人创建(可能是一个天才,因为这个东西很难)而且我想弄清楚答案是如何工作的,通过一个例子播放出行(I保持简单并用用户输入123播放功能。

答案有两个功能,但使用的第一个功能是我目前正在努力解决的问题......

相关代码是:

var PermutationStep1 = function(num) { 
  var num1 = num.toString();
  var ar = [];
  //return num1;
  if (num1.length < 2) {
   return num; 
  } else {
     for(var i = 0; i < num1.length; i++) { 
       var num2 = num1[i];
       var num3 = num1.substr(0,i) + num1.substr(i+1, num1.length -1);
       var numAr = PermutationStep1(num3);
       for(var j = 0; j < numAr.length; j++) {
         ar.push(numAr[j] + num2);
       }
      }
     ar.sort(function(a,b) {return a-b});
     return ar;  
   }
}

同样,我正在尝试通过此函数将输入的数字设为123(num = 123)。

我很确定这个函数应该输出一个包含多个元素的数组,因为第二个函数只是将这些数组元素与原始用户输入(在我们的例子中为123)进行比较,并返回下一个最大值。

所以在我们的例子中,我们应该得到一个名为'ar'的数组,返回一个3位数的主机。但由于某种原因,我得到一个2位数值的数组。我似乎无法孤立我的错误和我出错的地方。任何帮助,特别是我出错了(无论是递归,使用substring-method,还是将字符串连接在一起,无论我的问题是什么)都将不胜感激...

到目前为止,这是我的一些工作:

PS1(123) / num1 = 123
i = 0; 
num2 = (num1[i]) = '1'; 
num3 = (num1.substr(0, 0) + num1.substr(1, 2)) = ('0' + '23') = '23'

PS1(23)
i = 0; 
num2 = '2'; 
num3 = '3'

PS1(3) -> numAr = 3 (since num1 is less than 2 digits, which is the recursion base case?)

(So take 3 into the 2nd for loop)...
ar.push(numAr[j] + num2) = ar.push('3' + '1') = 31
ar = [31] at this point

And then I go through the initial for-loop a couple more times, where i = 1 and then i = 2, and I eventually get....
ar = [31, 32, 33]...

但我想我应该有类似ar = [131,132,133]的东西?我不知道我哪里出错了所以请帮忙。因为这个函数正确地吐出了答案,所以正确的答案是132。

注意:如果你需要模型答案的第二部分(即第二个功能),这里是:

var arr = [];

function PermutationStep(num1) {
    arr.push(PermutationStep1(num1));
    var arrStr = arr.toString();
    var arrStrSpl = arrStr.split(",");
   //return arrStrSpl;
    for(var p = 0; p < arrStrSpl.length; p++) {
        if(arrStrSpl[p] > num1) {
            return arrStrSpl[p];
        }
    }
    return -1;
}

3 个答案:

答案 0 :(得分:1)

好的,这是我的解决方案,我在20分钟内找到了它;)


//---- num should be a Number Object and not a String
function getNextNumber (num)
    {
    var numberStr=num.toString (), l=numberStr.length, i;
    var digits=new Array (), digitA, digitB;
    var weight,lightWeight;
    var valueDifference,biggerValue;

    for (i=l-1;i>-1;i--)
        digits.push (parseInt(numberStr.charAt(i)));   //  345 becomes a0=5 a1=4 a2=3 and we can say that num= a0*10^0+ a1*10^1+ a2*10^2, so the index becomes the decimal weight

    for (weight=1;weight<l;weight++)
        {
        digitA=digits[weight];
        biggerValue=new Array ();

        for (lightWeight=weight-1;lightWeight>-1;lightWeight--)
            {
            digitB=digits[lightWeight];

            if (digitB==digitA) continue;
            valueDifference=(digitA-digitB)*(-Math.pow(10,weight)+Math.pow (10,lightWeight));
            if (valueDifference>0) biggerValue.push(valueDifference);
            }

        if (biggerValue.length>0)
            {
            biggerValue.sort();
            return (biggerValue[0]+num);
            }
        }
    }

答案 1 :(得分:1)

对不起,我发布的第一个功能是在一个数学逻辑错误下,而我是在过分夸张 我再次考虑它,现在我有以下功能,definitley工作

function getNextNumber (num)
    {
    var numberStr=num.toString (), l=numberStr.length, i;

    var digits=new Array (), lighterDigits, digitAtWeight;
    var weight,lightWeight, lighterDigits_l, value=0;

    for (i=l-1;i>-1;i--)
        digits.push (parseInt(numberStr.charAt(i))); 

    lighterDigits=new Array ();
    lighterDigits.push (digits[0]);

    for (weight=1;weight<l;weight++)
        {
        digitAtWeight=digits[weight];
        lighterDigits_l=lighterDigits.length;


        for (lightWeight=0;lightWeight<lighterDigits_l;lightWeight++)
            {
            if (digitAtWeight<lighterDigits[lightWeight])
                {

                lighterDigits.unshift (lighterDigits.splice (lightWeight,1,digitAtWeight)[0]);
                lighterDigits.reverse ();
                digits=lighterDigits.concat (digits.slice (weight+1,l));
                for (weight=0;weight>l;weight++)
                    value+=Math.pow (10,weight)*digits[weight];
                return value;
                }
            }
        lighterDigits.push (digitAtWeight);
        }       
    return NaN;
    }

答案 2 :(得分:1)

这是我在没有使用递归函数的情况下解决问题的解决方案。它通过了所有关于coderbyte的测试。我还是新手,所以使用递归并不是我想要的第一件事。希望这可以帮助其他寻求解决方案的人。

function PermutationStep(num) {
  var numArr = (num + '').split('').sort().reverse();
  var numJoin = numArr.join('');
  for (var i = (num + 1); i <= parseInt(numJoin); i++){
    var aaa = (i + '').split('').sort().reverse();
    if (aaa.join('') == numJoin){
    return i;
    }
  }
  return -1;
}