2017-05-16 7 views
0

提供された文の中で最も長い単語の長さを返すため。 私の試み:再帰を使用して文中の最も長い文字列を検索する(Array.prototype.splice()メソッド)

function findLongestWord(str) { 

var arr = str.split(" "); 

function re(arr) { 

if (arr[0].length >= arr[1].length) {arr.splice(1,1); return re(arr);} 

/*if the first element's length is larger than the second element's length, 
splice the smaller element, then call its own function re(arr) using the 
array with the second element being spliced, which to my understanding 
is calling 
re(["Theeeee","brown","fox","jumped","over","the","lazy","dog"])*/ 

else if (arr[0].length < arr[1].length) {arr.splice(0,1); return re(arr);} 

} 

return arr[0].length; 

findLongestWord("Theeeee quick brown fox jumped over the lazy dog"); 

if文最初の後のコメントに関しては、私は再帰がどのように機能するかについてのあらゆる側面を誤解したのですか?ループのために使用して動作します

コード:

function findLongestWord(str) { 

var arr = str.split(" "); 

for (i = arr.length; i > 1 ;i--) { 

if (arr[0].length >= arr[1].length) {arr.splice(1,1);} 

else if (arr[0].length < arr[1].length) {arr.splice(0,1);} 

} 

return arr[0].length; 

findLongestWord("The quick brown fox jumped over the lazy dog"); 
+0

コードは何をしますか?それは期待どおりに機能しますか?そうでない場合は、あなたはどの入力を受け入れていますか、何を取り戻していますか?また、あなたのコードのフォーマットが乱れています。このコードは構文エラーを引き起こします。適切な書式設定と改行を使用してください。コードをあまりにも圧縮する理由はありません。 1行に1つのステートメントを使用します。 –

+0

こんにちはChristopher、アドバイスをいただきありがとうございます。後ほど書式設定の問題について深く掘り下げて説明します。今のところ、文の中で最も長い単語の長さを取得したいと思います。最初のコードはFreeCodeCampの挑戦に合格していませんが、forループを使って試行していますが、最初のコードについて混乱しています私はコールバック(arr)、私は何かを逃したのですか?コードは私に文の配列の最初の要素の長さを与え続けます、なぜ私は最初のif文の後にコードでコメントしたステップを実行していませんか? –

答えて

0

私が代わりに再帰のreduceを使用します。 Btw、クリストファーの勧告を適用する必要があります。私はあなたのコードをフォーマットし、それは私のために適切に動作します。ブラケットが1つしかありません。

let str = 'Some random words'; 
 

 
let result = str.split(' ').reduce(function(ret, el) { 
 
    return el.length > ret ? el.length : ret; 
 
}, 0); 
 

 
console.log(result);

あなたのコードは、2つのミスを持って、あなたはあなたの配列が一つだけのアイテムを持っていたし、まったく機能reを呼び出していなかった場合の制御されませんでした。

function findLongestWord(str) { 
 
    var arr = str.split(" "); 
 
    function re(arr) { 
 
    if(arr.length === 1) return arr; 
 
    if (arr[0].length >= arr[1].length) { 
 
     arr.splice(1,1); 
 
     return re(arr); 
 
    } else if (arr[0].length < arr[1].length) { 
 
     arr.splice(0,1); 
 
     return re(arr); 
 
    } 
 
    } 
 
    re(arr); 
 
    return arr[0].length; 
 
} 
 

 
let res = findLongestWord("The quick brown fox jumped over the lazy dog"); 
 
console.log(res);

+0

こんにちはDiegoさん、ありがとうございました。練習のために、最初のコードが動作するためには、どのような調整が必要かを知りたいですか?最初のif文のスプライス後にre(arr)関数自体をコールバックしている間、私は何か重要なことを見逃しましたか?コードは、コード内のifステートメントに関係なく、文字列配列の最初の要素の長さを与え続けました。 –

+0

@ShinraLowここにあります!疑いの余地はない。 – Diego

+0

ありがとう!最後に、私がうんざりしていた箇所を知っているので、ForループやWhileループのように、すべての関数が処理中のすべての関数を自動的に返すと仮定したFCCのすべての挑戦のデフォルトの開始点としてreturn文に慣れていました。大いに感謝します –

0

あなたは、単に目的の結果を得るためにMath.maxを使用することができます。再帰は必要ありません。

let sentence = "The quick brown fox jumped over the lazy dog"; 
 

 
function longestWord(s) { 
 
    return Math.max(...s.split(" ").map(v => v.length)); 
 
} 
 

 
console.log(longestWord(sentence))

+0

こんにちは、おかげさまで、誠に申し訳ありがとうございました。私は、最初のコードが機能するためには、どのような調整が必要かを知りたいと思います。最初のif文のスプライス後にre(arr)関数自体をコールバックしている間、私は何か重要なことを見逃しましたか?コードは、コード内のifステートメントに関係なく、文字列配列の最初の要素の長さを与え続けました。 –

0

再帰は、いくつかの条件が満たされるまで、あなたはその身体から同じ関数を呼び出すことを意味します。

あなたのコードは、このように書き換えることができます。

function findLongestWord(sentence, word) { 
    var wordsList = sentence.split(" "); 
    var lastWord = wordsList.pop(); 
    var longestWord = lastWord.length > word.length ? lastWord : word; 
    if (sentence.length > 0) { 
    var newSentence = wordsList.join(" "); 
    return findLongestWord(newSentence, longestWord); 
    } else { 
    return longestWord; 
    } 
}; 

var longestWord = findLongestWord("The quick brown fox jumped over the lazy dog", ''); 
console.log(longestWord); 

は、あなたが条件を確認することができます多くの方法があります。多くの場合、アキュムレータと呼ばれる変数があります。ここで私は引数として渡されたsenteceだけを使用しました。単語があるかどうかをチェックします(単語の表に分割した後)。単語がない場合、私は最終結果を返します。私の例では、この件をより明確にすることを願っています。

+0

こんにちはKamilDさん、ありがとうございました。練習のために、最初のコードが機能するためには、どのような調整が必要なのかを知りたいですか?最初のif文のスプライス後にre(arr)関数自体をコールバックしている間、私は何か重要なことを見逃しましたか?コードは、コード内のifステートメントに関係なく、文字列配列の最初の要素の長さを与え続けました。 –

関連する問題