2017-02-07 26 views
0

タイトルが示すように、私は再帰的にJavaScriptの問題を解決しようとしていました。私のインターネットプログラミングクラスの練習は、関数に入力された文字列を逆転させることでした。これを再帰で解く良い機会としてこれを見ました。私のコード:再帰で最大呼び出しスタックサイズを超えました

function reverseStr(str){ 
    str = Array.from(str); 
    let fliparray = new Array(str.length).fill(0); 
    let char = str.slice(-1); 
    fliparray.push(char); 
    str.pop(); 
    str.join(""); 
    return reverseStr(str); 
} 
writeln(reverseStr("hello")) 
+3

あなたの再帰は基本ケースを持っていません。 – Bergi

+0

終了条件は何ですか? –

+0

それぞれの行が何をするかと、再帰アルゴリズムの仕組みについてコメントできますか?例の文字列で実行すべきステップを示しているかもしれません。 – Bergi

答えて

1

を最大の問題は、あなたの関数が終了(ベース)ケースを持っていないということです。それはいつそれが停止するはずか、永遠に再発するかを認識するための何らかの方法が必要です。

2番目の問題は、実際に再帰的に考えているようには見えないということです。文字列を変更していますが、変更された文字列に対してもう一度reverseStr()を呼び出すだけで、すべてのプロセスをもう一度開始します。

以下はあなたの試みと実際には似ていませんが(私はあなたの試みを救済する方法はわかりませんが)、逆の文字列アルゴリズムを再帰的に実装する簡単な方法です。

function reverseStr(str) { 
 
    // string is 0 or 1 characters. nothing to reverse 
 
    if (str.length <= 1) { 
 
    return str; 
 
    } 
 

 
    // return the first character appended to the end of the reverse of 
 
    // the portion after the first character 
 
    return reverseStr(str.substring(1)) + str.charAt(0); 
 
} 
 

 
console.log(reverseStr("Hello Everybody!"));

+0

ありがとうございました!実際のエラーはid10tだったのに、私が必要としていたコードを取り戻しましたが、あなたの反応は大きく助けになりました – Allen

0

これは再帰を介して行われ、これを試してみてください:)

let fliparray = new Array(); 
 

 
function reverseStr(str) { 
 
    str = Array.from(str); 
 
    // let fliparray = new Array(str.length).fill(0); 
 
    let char = str.slice(-1); 
 
    fliparray.push(char[0]); 
 
    str.pop(); 
 
    str.join(""); 
 
    if (str.length > 0) { 
 
    return reverseStr(str); 
 
    } else { 
 
    return fliparray; 
 
    } 
 
} 
 
console.log(reverseStr("hello"))

+0

これは、文字列の文字が逆の順序で配列を返します。文字列に戻す必要があります。 – JLRishe

+1

...これはグローバルで静的な配列です。このコードは多くても一度しか動作しません。 – Bergi

関連する問題