繁体   English   中英

如何递归地反转字符串

[英]How to reverse a string recursively

前几天我在一次采访中,被要求写一个递归地反转字符串的方法。

我开始编写一个调用自己的方法并陷入困境。

这是我被问到的,在JavaScript中递归地反转字符串“ Obama”。

这是我走了多远。

function reverseString(strToReverse)
{

         reverseString(strToReverse);

};

被困住了,他们说我不循环。

任何人有任何想法吗?

看看这样说:颠倒字符串将与原来的最后一个字母,后面的一切,但最后一个字母,颠倒启动

所以:

function reverseString(strToReverse)
{
  if (strToReverse.length <= 1)
    return strToReverse;

  // last char +
  // 0 .. second-last-char, reversed
  return strToReverse[strToReverse.length - 1] + 
    reverseString( strToReverse.substring(0, strToReverse.length - 1) );
}

最简单的一个:

 function reverse(input) { if (input == null || input.length < 2) return input; return reverse(input.substring(1)) + input.charAt(0); } console.log(reverse('Barack Obama')); 

有关更简洁的版本,请参见下面的@MaxZoom解决方案

请注意,我自己的答案中的尾部递归样式与普通递归版本相比没有任何优势,因为不需要JS解释器执行尾部消除。

[原版的]

这是一个尾部递归版本,其工作原理是从输入字符串的开头删除一个字符,然后将其放在“ accumulator”字符串的前面:

function reverse(s, acc) {
  if (s.length <= 0) { return acc; }
  return reverse(s.slice(1), s.charAt(0) + (acc||''));
}

reverse('foobar'); // => "raboof"

单线解决方案。 如果他们问,我告诉他们在本机代码部分是递归的,不要再问其他愚蠢的问题。

var result = "Obama".split('').reverse().join('');

输出: amabO

真正的问题不是“如何反转字符串”。 真正的问题是“您了解递归”。 那就是面试问题!

因此,为了解决此问题,您需要向您展示知道什么是递归,而不是可以反转字符串“ Obama”。 如果您只需要反转字符串“ Obama”,则可以编写return "amabO"; 看到?

换句话说,这个特定的编程任务不是全部! 真正的解决方案不是从此处的答案中复制并粘贴代码,而是要了解递归。

简单来说,

  • 递归涉及再次调用相同的函数,是的,但这还不是全部
  • 为了防止堆栈溢出,您必须确保该函数不会无限期地调用自身
  • 因此,总有一种情况,函数可以退出而不调用自身(再次)
  • 并且当它再次调用自身时,应该使用使上述情况更可能发生的参数进行调用。

对于字符串操作,一种使所有这些事情发生的方法是确保仅使用比被调用的字符串短的字符串来调用自身。 由于字符串的长度不是无限的,因此该函数不能以这种方式无限次地调用自身。 因此,条件可能是字符串的长度为零,在这种情况下,不可能用较短的字符串来调用自身。

如果您可以证明自己了解所有这些知识,并且可以在现实世界的程序中使用它,那么您就可以通过面试了。 如果您复制并粘贴在Internet上找到的某些来源,则不会。

希望这可以帮助!

我们可以使用三元运算符轻松地在递归方法中反转字符串

function reverseString(strToReverse) {

    return str.length > 1 ? reverse(str.slice(1)) + str.charAt(0) : str;
}

reverseString("America");

反向字符串不是最聪明的方法,但是它是递归的:

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'));

这是一个jsfiddle

也许是这样的吗?

var base = 'Obama',
    index = base.length,
    result = '';

function recursive(){
    if (index == 0) return;
    index -= 1;
    result += base[index];
    recursive();
}

recursive();

alert(result);

jsfiddle: https ://jsfiddle.net/hy1d84jL/

编辑:您可以将递归视为for..loop的无限。 让我们以“受控”方式使用它,并定义界限-最小为0, Obama单词的长度为最大。 现在,让我们自己调用任意次数,并执行所需的操作以反转字符串,这是-将index变量减1,然后从最后算起字符。 希望能帮助到你。 好问题。

如果函数只能有一个输入,我将把字符串分成越来越小的部分,并以相反的顺序将它们全部加在一起

function reverseString(strToReverse){
  if (strToReverse.length <= 1) { return strToReverse; }

  return reverseString(strToReverse.substr(1, strToReverse.length - 1) + strToReverse[0];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM