Javascript 如何递归地反转字符串
前几天我在一次采访中被要求写一个递归反转字符串的方法 我开始编写一个调用自身的方法,结果陷入了困境 下面是我被问到的,用JavaScript递归反转字符串“Obama” 这是我走了多远Javascript 如何递归地反转字符串,javascript,recursion,Javascript,Recursion,前几天我在一次采访中被要求写一个递归反转字符串的方法 我开始编写一个调用自身的方法,结果陷入了困境 下面是我被问到的,用JavaScript递归反转字符串“Obama” 这是我走了多远 function reverseString(strToReverse) { reverseString(strToReverse); }; 被卡住了,他们对我说不 有人有什么想法吗?请这样看:颠倒的字符串将以原始字符串的最后一个字母开头,然后是除最后一个字母外的所有字符,颠倒 因此: 功
function reverseString(strToReverse)
{
reverseString(strToReverse);
};
被卡住了,他们对我说不
有人有什么想法吗?请这样看:颠倒的字符串将以原始字符串的最后一个字母开头,然后是除最后一个字母外的所有字符,颠倒 因此:
功能反向限制(strToReverse)
{
if(strToReverse.length不是反转字符串的最聪明的方法,但它是递归的:
function reverse(input, output) {
output = output || '';
if (input.length > 0) {
output = output.concat(input[input.length -1]);
return reverse(input.substr(0, input.length - 1), output);
}
return output;
}
console.log(reverse('Obama'));
这是一个也许是这样的
var base = 'Obama',
index = base.length,
result = '';
function recursive(){
if (index == 0) return;
index -= 1;
result += base[index];
recursive();
}
recursive();
alert(result);
jsfiddle:
编辑:您可以将递归视为..循环的无限方法并定义边界-0表示最小值,将Obama
单词的长度定义为最大值。现在,让我们让它自己调用任意次数,并执行您需要的操作,以反转字符串,即将索引
变量减量1,并从末尾对字符求和。希望这有帮助。问得好。如果该函数只能有一个输入,我会将字符串分割成越来越小的片段,并以相反的顺序将它们全部添加到一起
function reverseString(strToReverse){
if (strToReverse.length <= 1) { return strToReverse; }
return reverseString(strToReverse.substr(1, strToReverse.length - 1) + strToReverse[0];
}
功能反向限制(strToReverse){
如果(strToReverse.length最简单的一个:
功能反转(输入){
if(input==null | | input.length<2)返回输入;
返回反向(输入子串(1))+输入字符(0);
}
log(reverse('Barack Obama');
单行解决方案。如果他们问我,我会告诉他们这是本机代码部分的递归,不要再问任何愚蠢的问题
var result = "Obama".split('').reverse().join('');
输出:amabO有关更简洁的版本,请参阅
请注意,我自己的答案中的尾部递归样式与普通递归版本相比没有优势,因为不需要JS解释器来执行尾部调用消除
[原件]
下面是一个尾部递归版本,其工作原理是从输入字符串的前面删除一个字符,并将其前置到“累加器”字符串的前面:
功能反转(s、acc){
如果(s.长度“拉博夫”
这里真正的问题不是“如何反转字符串”。真正的问题是“您理解递归吗”。这就是面试问题的内容
因此,为了解决这个问题,您需要显示您知道递归是关于什么的,而不是您可以反转字符串“Obama”。如果您所需要做的只是反转字符串“Obama”,您可以编写返回“amabO”;
参见
换句话说,这个特定的编程任务不是它的全部!真正的解决方案不是从这里的答案复制和粘贴代码,而是了解递归
简言之
- 递归涉及再次调用同一个函数,是的,但这还不是全部
- 为了防止堆栈溢出,必须确保函数不会无限期地调用自身
- 因此,总是有一个条件,在该条件下,函数可以退出而不调用自身(再次)
- 当它再次调用自己时,它应该使用使上述情况更可能发生的参数
在字符串操作的情况下,实现这一切的一种方法是确保它只使用比调用它时使用的字符串短的字符串来调用自己。因为字符串不是无限长的,所以函数不能以这种方式调用自己无限次。因此条件可以是字符串的长度为零,在这种情况下,不可能用较短的字符串调用自己
如果你能证明你知道所有这些,并能在现实世界的程序中使用这些,那么你就可以通过面试了。如果你复制并粘贴你在互联网上找到的一些信息来源,那就不行了
希望这有帮助!我们可以使用三元运算符在递归方法中轻松反转字符串
function reverseString(strToReverse) {
return str.length > 1 ? reverse(str.slice(1)) + str.charAt(0) : str;
}
reverseString("America");
为什么需要递归调用它?Obama.split(“”).reverse().join(“”)
还不够吗?@danronmoon它说这是为了面试。答案可能是重复的,但我不确定我们是否能帮助你通过面试。这是你需要自己做的事情。@AlumCloud.Com他们要求递归函数的原因(即使有更好的方法解决它)因为他们想看看你是怎么想的,看看你是否能用逻辑解决问题这让我头疼:D@tymeJV简单地考虑第一个和最后一个步骤。简洁简洁的解决方案。重用数组内建函数的好方法。
function reverseString(strToReverse) {
return str.length > 1 ? reverse(str.slice(1)) + str.charAt(0) : str;
}
reverseString("America");