【问题标题】:Don't Understand JS Recursion不懂 JS 递归
【发布时间】:2019-03-12 12:29:52
【问题描述】:

我编写了一个简单的 javascript 程序来执行递归。由于某种原因,它没有像我期望的那样工作。在递归的一个级别上,当我应该得到 cd 时,我得到 bcd。

任何帮助将不胜感激。

function recursion_test(i_s) {
    console.log('starting string:' + i_s);
    if (i_s.length <= 1) {
        console.log('base case: ' +i_s);
        return
    } else {
        midPoint = Math.floor(i_s.length /2);
        console.log('mid:' + midPoint, 'l: ' + i_s.substring(0,midPoint), ' r: '+ i_s.substring(midPoint, i_s.length));
        recursion_test(i_s.substring(0, midPoint));
        recursion_test(i_s.substring(midPoint, i_s.length));
    }

}

var start_str = "abcd";
console.log("Done: " + recursion_test(start_str));

The starting string:abcd
rec_test:32 mid:2 l: ab  r: cd
rec_test:26 starting string:ab
rec_test:32 mid:1 l: a  r: b
rec_test:26 starting string:a
rec_test:28 base case: a
rec_test:26 starting string:b
rec_test:28 base case: b
rec_test:26 starting string:bcd
rec_test:32 mid:1 l: b  r: cd
rec_test:26 starting string:b
rec_test:28 base case: b
rec_test:26 starting string:cd
rec_test:32 mid:1 l: c  r: d
rec_test:26 starting string:c
rec_test:28 base case: c
rec_test:26 starting string:d
rec_test:28 base case: d
rec_test:40 Done: undefinedoutput:

【问题讨论】:

  • 欢迎来到 SO!恐怕我不遵循此功能的意图。您能描述一下您希望它如何工作吗?
  • 只是一个递归分解字符串并打印每个字符的玩具程序

标签: javascript recursion


【解决方案1】:

你应该在midPoint之前使用let,否则它会成为全局变量

function recursion_test(i_s) {
    console.log('starting string:' + i_s);
    if (i_s.length <= 1) {
        console.log('base case: ' +i_s);
        return
    } else {
        let midPoint = Math.floor(i_s.length /2);
        console.log('mid:' + midPoint, 'l: ' + i_s.substring(0,midPoint), ' r: '+ i_s.substring(midPoint, i_s.length));
        recursion_test(i_s.substring(0, midPoint));
        recursion_test(i_s.substring(midPoint, i_s.length));
    }

}
var start_str = "abcd";
console.log("Done: " + recursion_test(start_str));

【讨论】:

    【解决方案2】:

    这是因为你定义的变量midPoint是一个全局变量。

            recursion_test(i_s.substring(0, midPoint));
            recursion_test(i_s.substring(midPoint, i_s.length));
    

    上面的第一个recursion_test 会将midPoint 的值更改为1,使第二个函数(其中i_s=='abcd')将'abcd'.substring(1, 4) -&gt; bcd 作为输入。

    要解决此问题,只需在变量 midPoint 之前添加 var

    【讨论】:

      【解决方案3】:

      function Write(str){
           console.log(str);
      }
      
      function getData(s,start,end=0){
         if (end == 0) {
             end = s.length;
         }
         return s.substring(start, end)
      }
      
      function getMidPoint(s) {
        var midPoint = Math.floor(s.length / 2);
       var left  = getData(s,0, midPoint);
       var right = getData(s,midPoint);
        Write('mid:' + midPoint + ' L: ' + left + ' R: ' + right );
        return midPoint;
      }
      
      function recursion_test(i_s) {
        Write(`Starting String: ` + i_s);
        if (i_s.length <= 1) {
          Write('base case: ' + i_s);
        } else {
          let midPoint = getMidPoint(i_s);
          let left = getData(i_s,0,midPoint);
          let right = getData(i_s,midPoint);
          let arr = [left,right];
          arr.forEach(function(e) {
              recursion_test(e);
          });
          return "All Done";
        }
      
      }
      var start_str = "abcd";
      Write(recursion_test(start_str));

      此解决方案只是重构代码,以便一目了然。另外请注意,使用let 声明的变量只存在于块范围内。

      【讨论】:

        猜你喜欢
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 2017-10-13
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多