210615.Today Iラーニング(TIL):戻る(UnpackGiftbox)
再帰関数を学習する際、最も印象的な問題はGiftbox問題を解くことです.今日はこの問題を分析します.
質問する
プレゼントボックス情報を含む配列と文字列を入力して、条件を満たすプレゼントがあるかどうかを返します.
入力
パラメータ1:giftBox
文字列;配列を要素とする再帰的に配列を定義する(I/Oの例を参照)
文字列は、プレゼントボックス内の各プレゼントの名前を表します.
配列は、より小さなギフトボックスを表します.
パラメータ2:wish
stringタイプの文字列
しゅつりょく
booleanタイプを返す必要があります.
注意事項関数unpackGiftboxは再帰関数として作成されます. 複文(for,while)を使用できます. 入力配列は、関数呼び出し後に初期状態(不変)を維持する必要があります. の空の配列または空の文字列を入力した場合はfalseを返す必要があります. I/O例
だから、私は1種の方法を見て悟って、これは1種のとても簡単で十分な方法ですが、しかし私の固有の観念(?)先入観(?)不器用な事故(?)そのため、これは考えられない方法です.giftBoxのギフトボックスを開くにはfor loopを回します...
質問する
プレゼントボックス情報を含む配列と文字列を入力して、条件を満たすプレゼントがあるかどうかを返します.
入力
パラメータ1:giftBox
文字列;配列を要素とする再帰的に配列を定義する(I/Oの例を参照)
文字列は、プレゼントボックス内の各プレゼントの名前を表します.
配列は、より小さなギフトボックスを表します.
パラメータ2:wish
stringタイプの文字列
しゅつりょく
booleanタイプを返す必要があります.
注意事項
const giftBox = ['macbook', 'mugcup', ['eyephone', 'postcard'], 'money'];
let output = unpackGiftbox(giftBox, 'iphone');
console.log(output); // --> false
output = unpackGiftbox(giftBox, 'postcard');
console.log(output); // --> true
まず、最初に接触する方法は、include()メソッドを使用して、所与のgiftBoxがwishを含むかどうかを決定し、値がtrueを返すとtrueを結果として返し、そうでない場合はflat()メソッドを使用してgiftBoxをさらに開くためにコードを記述することである.function unpackGiftBox(giftBox, wish) {
if(giftBox.includes(wish) return true;
else if(giftBox.length === 0 || giftBox.includes(wish) === false)
return unpackGiftBox(giftBox.flat(), wish)
}
しかし,このコードの致命的な欠点はflat()法である.我々の目的はflat()法を用いずに問題を解決することである.flat()メソッドは,1次元配列時にも自己無限展開をロールバックするメソッドであり,すべてのギフトボックスを開いてもwishのような要素が見つからないと再帰呼び出しを停止しfalseをロールバックできず,無限に再帰呼び出しを繰り返す.これで最終的に「Maxim call stack sizeオーバー」エラーが発生します.だから、私は1種の方法を見て悟って、これは1種のとても簡単で十分な方法ですが、しかし私の固有の観念(?)先入観(?)不器用な事故(?)そのため、これは考えられない方法です.giftBoxのギフトボックスを開くにはfor loopを回します...
function unpackGiftBox(giftBox, wish) {
for(let i = 0; i < giftBox.length; i++) {
if(giftBox[i] === wish) { // giftBox의 요소와 wish가 일치하면 바로 true를 리턴
return true;
}
else if(Array.isArray(giftBox[i])) { // 그렇지 않고 giftBox의 요소가 배열이라면(아직 열지 않은 선물상자)
const result = unpackGiftbox(giftBox[i], wish); // 재귀호출 한 결과가 true일 때
if(result === true) return true; // 최종적으로 true를 리턴
}
}
return false; // 모든 반복이 끝나고도 true를 리턴하지 못하게 되면 wish와 같은 선물을 찾지 못한 것이므로 false를 리턴
}
再帰関数アルゴリズムは,再帰自体が繰返し文の代替であると考えられるため,繰返し文を用いる理由がなく,この方法が考えられなかった決定的な原因である.再帰関数の問題が与えられていないか,あるいは再帰関数を使用する必要がない他の問題があれば,for重複配列の要素をためらうことなく遍歴すべきであるが,再帰関数関連の問題であるだけでfor loop関連の思考を遮断することはしばしば残念ではない.アルゴリズムの問題を解く過程で、私はずっと多くの柔軟な思考に欠けていると思っています.今後も様々な問題を解決し続けていけば、ますます柔軟な思考が可能になると思います.今日のTIL终わりReference
この問題について(210615.Today Iラーニング(TIL):戻る(UnpackGiftbox)), 我々は、より多くの情報をここで見つけました https://velog.io/@elma98/210615.-Today-I-LearnedTIL-재귀unpackGiftboxテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol