【问题标题】:Printing triangle with word characters in JavaScript using recursion only仅使用递归在 JavaScript 中打印带有单词字符的三角形
【发布时间】:2016-11-14 05:24:24
【问题描述】:

面试题:我被要求写一个递归的 JavaScript 函数,它以一个 P 字符长的字符串作为输入,并打印出以下内容:

  1. 第一行打印字符串的第一个字符
  2. 第二行打印字符串的前两个字符
  3. 以此类推,直到第 P 行打印出字符串的所有字符
  4. 第 (P+1) 行打印前 (P-1) 个字符
  5. 第 (P+2) 行打印前 (P-2) 个字符
  6. 以此类推,直到第 (2P -1) 行只打印第一个字符

如果我们运行函数:printTriangle("A Joke")

它将打印出以下内容:

一个

一个

阿杰

一个乔

一个笑话

一个笑话

一个笑话

一个乔

阿杰

一个

一个

面试让我写这个函数,我只能用迭代的方式写。还在想如何用递归的方式来写,有大神能指点一下吗?

【问题讨论】:

  • 您可以在 printTriangle() 函数中添加可选的第二个参数。如果这是为了面试,我相信自己尝试一下是公平的。
  • 一种方法是让您的函数在 调用自身之前和之后 打印一个子字符串。每个调用都告诉下一个调用绘制一个更长的子字符串,直到打印完整的字符串。
  • @PieterWitvoet 我已经使用这种方法进行了回答。

标签: javascript string recursion


【解决方案1】:

这是一个解决方案,正如 Pieter Witvoet 所暗示的那样,它使用一个递归调用和两个打印。它比其他的更简单,并且希望更易于理解,因为它使用递归方法,而不是将迭代装扮成尾递归。

function triangle(str, i) {
  i = i || 1;
  var start = str.substr(0, i);

  console.log(start);
  if (i < str.length) {
    triangle(str, i + 1);
    console.log(start);
  }
}

triangle("A Joke");

【讨论】:

    【解决方案2】:

    这是我在函数式 JavaScript 中使用递归的解决方案。

    (function(window) {
      var recursion = function(str, index, canReverse) {
      var index = !index ? 0 : index,
          result = str.substring(0, index),
          len = str.length;
        console.log(result);
        if (index < len && !canReverse) {
          recursion(str, ++index);
        } else if (index > 0) { // reverse
          recursion(str, --index, true);
        }
      };
      recursion('A joke')
    })(window);

    【讨论】:

    • 感谢您的回答。打印两次“A Joke”。面试官还告诉我,在递归方法中不要使用任何循环。
    • 如果我错了也请纠正我,这不是递归的方法。
    • 我添加了一个递归示例。
    【解决方案3】:

    这是另一个递归解决方案。

    var i = 1; //counter
    
    /*Recursive function*/
    function printTriangle(str) {
      var len = str.length;
      if (len > i) { //process string in default order
        console.log(str.substring(0, i));
        i += 1;
        return printTriangle(str);
      } else if (len > 0) { //process string in reverse order
        console.log(str);
        var sub_str = str.substring(0, str.length - 1);
        return printTriangle(sub_str);
      } else {
        return str;
      }
    }
    
    /*Process string*/
    printTriangle("A Joke");

    【讨论】:

      【解决方案4】:
              function rPrint(val, num) {
              var n2 = num;
              if (num > val.length)
                  n2 = val.length- Math.abs(val.length - num);
              document.write("<br>" + val.toString().substr(0, n2));
              if (num < val.length*2)
                  rPrint(val, ++num);
          }
      

      然后像rPrint("A Joke",1);一样使用它

      【讨论】:

        【解决方案5】:

        这是我的解决方案:

        function triangle(str, i) {
        
          if(i === 0) return;
            
          i = i || 1;
            
          if(i > str.length) return triangle(str, -1*str.length+1) ;
            
          console.log(str.substr(0, Math.abs(i)));
            
          return triangle(str, i+1) ;
        }
        
        triangle("A Joke");

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-14
          • 1970-01-01
          • 1970-01-01
          • 2022-11-25
          • 1970-01-01
          • 2016-02-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多