【问题标题】:Javascript: Example of recursive function using for loops and substring - can't figure out where I'm going wrongJavascript:使用 for 循环和子字符串的递归函数示例 - 无法弄清楚我哪里出错了
【发布时间】:2014-03-10 00:45:51
【问题描述】:

我目前正在处理 coderbyte 的题为“排列步骤”的中等挑战。

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

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

答案有 2 个功能,但使用的第一个功能是我目前正在尝试解决的...

相关代码为:

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;  
   }
}

再次,我正在尝试通过此函数使用输入的 num 为 123 (num = 123)。

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

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

这是我迄今为止的一些工作:

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;
}

【问题讨论】:

    标签: javascript for-loop recursion substr


    【解决方案1】:

    对不起,我发布的第一个函数存在数学逻辑错误,我操之过急 我又想了想,现在我有了以下 definitley 工作的功能

    函数 getNextNumber (num) { var numberStr=num.toString (), l=numberStr.length, i; var 数字=新数组 (),lighterDigits,digitAtWeight; 变体重量,轻重量,打火机Digits_l,值= 0; 对于 (i=l-1;i>-1;i--) 数字.push (parseInt(numberStr.charAt(i))); 更轻的数字=新数组(); 打火机Digits.push(数字[0]); 对于(重量=1;重量l;重量++) value+=Math.pow (10,weight)*digits[weight]; 返回值; } } LighterDigits.push (digitAtWeight); } 返回 NaN; }

    【讨论】:

      【解决方案2】:

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

      //---- num 应该是一个数字对象而不是一个字符串 函数 getNextNumber (num) { var numberStr=num.toString (), l=numberStr.length, i; var 数字=新数组 (), digitA, digitB; 变量重量,轻重量; var valueDifference,更大的值; 对于 (i=l-1;i>-1;i--) 数字.push (parseInt(numberStr.charAt(i))); // 345变成a0=5 a1=4 a2=3 可以说num= a0*10^0+ a1*10^1+ a2*10^2,所以索引就变成了小数权重 对于(重量=1;重量-1;lightWeight--) { digitB=数字[lightWeight]; if (digitB==digitA) 继续; valueDifference=(digitA-digitB)*(-Math.pow(10,weight)+Math.pow(10,lightWeight)); if (valueDifference>0) 更大的Value.push(valueDifference); } 如果(更大的值。长度> 0) { 更大的值.sort(); 返回(更大的值[0]+数字); } } }

      【讨论】:

        【解决方案3】:

        这是我在不使用递归函数的情况下找到的解决方案。它通过了 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-10
          • 1970-01-01
          • 2021-08-30
          • 1970-01-01
          相关资源
          最近更新 更多