仅使用递归在JavaScript中打印带单词字符的三角形

仅使用递归在JavaScript中打印带单词字符的三角形,javascript,string,recursion,Javascript,String,Recursion,采访问题:我被要求编写一个递归JavaScript函数,该函数以一个p字符长的字符串作为输入,并打印出以下内容: 第一行打印字符串的第一个字符 第二行打印字符串的前两个字符 依此类推,直到第Pth行打印字符串的所有字符 第(P+1)行打印第一个(P-1)字符 第(P+2)行打印第一个(P-2)字符 依此类推,直到第(2P-1)行只打印第一个字符 如果我们运行函数:printTriangle(“笑话”) 它将打印出以下内容: A A A J 工作 玩笑 笑话 玩笑 工作 A J A A 我在面试中

采访问题:我被要求编写一个递归JavaScript函数,该函数以一个p字符长的字符串作为输入,并打印出以下内容:

  • 第一行打印字符串的第一个字符
  • 第二行打印字符串的前两个字符
  • 依此类推,直到第Pth行打印字符串的所有字符
  • 第(P+1)行打印第一个(P-1)字符
  • 第(P+2)行打印第一个(P-2)字符
  • 依此类推,直到第(2P-1)行只打印第一个字符
  • 如果我们运行函数:printTriangle(“笑话”)

    它将打印出以下内容:

    A

    A

    A J

    工作

    玩笑

    笑话

    玩笑

    工作

    A J

    A

    A


    我在面试中被要求写这个函数,我只能用迭代的方法来写。仍然想知道如何使用递归方法编写,有人能给我一些启发吗?

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

    (功能(窗口){
    var递归=函数(str、index、canReverse){
    变量索引=!索引?0:索引,
    结果=str.substring(0,索引),
    len=str.长度;
    控制台日志(结果);
    如果(索引0){//则为else
    递归(str,-index,true);
    }
    };
    递归(“笑话”)
    
    })(窗口)这是我在函数式JavaScript中使用递归的解决方案

    (功能(窗口){
    var递归=函数(str、index、canReverse){
    变量索引=!索引?0:索引,
    结果=str.substring(0,索引),
    len=str.长度;
    控制台日志(结果);
    如果(索引0){//则为else
    递归(str,-index,true);
    }
    };
    递归(“笑话”)
    })(窗口)以下是我的解决方案:

    函数三角形(str,i){
    如果(i==0)返回;
    i=i | | 1;
    如果(i>str.length)返回三角形(str,-1*str.length+1);
    log(str.substr(0,Math.abs(i));
    返回三角形(str,i+1);
    }
    三角形(“笑话”)以下是我的解决方案:

    函数三角形(str,i){
    如果(i==0)返回;
    i=i | | 1;
    如果(i>str.length)返回三角形(str,-1*str.length+1);
    log(str.substr(0,Math.abs(i));
    返回三角形(str,i+1);
    }
    三角形(“笑话”)
    函数rPrint(val,num){
    var n2=num;
    如果(数值>数值长度)
    n2=val.length-Math.abs(val.length-num);
    document.write(“
    ”+val.toString().substr(0,n2)); if(num
    然后像
    rPrint(“一个笑话”,1)那样使用它

    函数rPrint(val,num){
    var n2=num;
    如果(数值>数值长度)
    n2=val.length-Math.abs(val.length-num);
    document.write(“
    ”+val.toString().substr(0,n2)); if(num

    然后像
    rPrint(“一个笑话”,1)那样使用它

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

    var i=1//柜台
    /*递归函数*/
    函数printTriangle(str){
    var len=str.length;
    if(len>i){//按默认顺序处理字符串
    log(str.substring(0,i));
    i+=1;
    返回打印三角形(str);
    }如果(len>0){//则按相反顺序处理字符串
    console.log(str);
    var sub_str=str.substring(0,str.length-1);
    返回打印三角形(sub_str);
    }否则{
    返回str;
    }
    }
    /*进程字符串*/
    
    printTriangle(“笑话”)这里是另一个递归解决方案

    var i=1//柜台
    /*递归函数*/
    函数printTriangle(str){
    var len=str.length;
    if(len>i){//按默认顺序处理字符串
    log(str.substring(0,i));
    i+=1;
    返回打印三角形(str);
    }如果(len>0){//则按相反顺序处理字符串
    console.log(str);
    var sub_str=str.substring(0,str.length-1);
    返回打印三角形(sub_str);
    }否则{
    返回str;
    }
    }
    /*进程字符串*/
    
    printTriangle(“笑话”)正如Pieter Witvoet所提到的,这里有一个解决方案,它使用一个递归调用和两个打印。它比其他方法更简单,也更容易理解,因为它使用递归方法,而不是像尾部递归那样的迭代

    函数三角形(str,i){
    i=i | | 1;
    var start=str.substr(0,i);
    console.log(启动);
    如果(i三角形(“笑话”)正如Pieter Witvoet所提到的,这里有一个解决方案,它使用一个递归调用和两个打印。它比其他方法更简单,也更容易理解,因为它使用递归方法,而不是像尾部递归那样的迭代

    函数三角形(str,i){
    i=i | | 1;
    var start=str.substr(0,i);
    console.log(启动);
    如果(i三角形(“笑话”)可以向printTriangle()函数添加可选的第二个参数。如果这是面试的话,我相信自己尝试一下是公平的。一种方法是让你的函数在调用自己之前和之后都打印一个子字符串。每个调用都告诉下一个调用绘制更长的子字符串,直到打印出完整的字符串。@PieterWitvoet我已经用这种方法进行了回答。您可以向printTriangle()函数添加可选的第二个参数。如果这是面试的话,我相信自己尝试一下是公平的。一种方法是让你的函数在调用自己之前和之后都打印一个子字符串。每次调用都会告诉下一次调用绘制更长的子字符串,直到打印出完整的字符串。@PieterWitvoe
    
            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);
        }