簡體   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