仅使用递归在JavaScript中打印带单词字符的三角形
采访问题:我被要求编写一个递归JavaScript函数,该函数以一个p字符长的字符串作为输入,并打印出以下内容:仅使用递归在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中使用递归的解决方案
(功能(窗口){
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);
}