210615.Today Iラーニング(TIL):戻る(UnpackGiftbox)


再帰関数を学習する際、最も印象的な問題はGiftbox問題を解くことです.今日はこの問題を分析します.
質問する
プレゼントボックス情報を含む配列と文字列を入力して、条件を満たすプレゼントがあるかどうかを返します.
入力
パラメータ1:giftBox
文字列;配列を要素とする再帰的に配列を定義する(I/Oの例を参照)
文字列は、プレゼントボックス内の各プレゼントの名前を表します.
配列は、より小さなギフトボックスを表します.
パラメータ2:wish
stringタイプの文字列
しゅつりょく
booleanタイプを返す必要があります.
注意事項
  • 関数unpackGiftboxは再帰関数として作成されます.
  • 複文(for,while)を使用できます.
  • 入力配列は、関数呼び出し後に初期状態(不変)を維持する必要があります.
  • の空の配列または空の文字列を入力した場合はfalseを返す必要があります.
  • I/O例
    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终わり