2022/04/19) 10. シーケンスを求めて[再帰関数と完全なナビゲーション(DFS:深度優先ナビゲーション)]
1.質問
<シーケンスの取得>
:10以下のN個の自然数が与えられた場合、そこからM個を抽出し、すべての列を一列にする方法を出力する.
第1行は自然数NとMを与える.2行目にはN個の自然数が昇順に与えられる.
2.解決方法
DFS(1)のFOR文が満たされている場合はポップアップされます.DFS(0)のFOR文DFS(0)はtmp[0]の値を決定し、DFS(1)はtmp[1]の値を決定する.DFS[2]はpushを提供する.
DFS(0)のfor文(i=0、1、2)
ex ) [3, ][6, ] [9, ]
DFS(1)におけるfor文(i=0,1,2)
ex)DFS(0)のiが0の場合,[3,6],[3,9]!!
DFS(0)のiが1である場合,[6,3],[6,9],および[6,9],および[3],[3],[3],[3],[3],[3],[3],[3],[3],[3]
DFS(0)のiが2の場合,[9,3],[9,6]
3.正解
<script>
function solution(m, arr){
let answer=[];
n=arr.length;
let ch=Array.from({length:n}, ()=>0); //체크배열(인덱스 n개의 배열을 생성해야 함)
let tmp=Array.from({length:m}, ()=>0);; //뽑는 걸 담는 거(인덱스 m개의 배열을 생성해야 함)
function DFS(L){
if(L===m){ //D(2)
answer.push(tmp.slice());
}
else{
for(let i=0; i<n; i++){ //3. DSF(1)의 for문을 돌리자. i가 0일 때 : ch(0)===1이므로 바로 끝 // 4. i가 1일 때 : if문 통과하고 tmp[1]=arr[1] ===> tmp[3,6] //6. i가 2일 때 : if문 통과하고 tmp[1]=arr[2] ===> tmp[3,9]
if(ch[i]===0){
ch[i]=1;
tmp[L]=arr[i]; //1. tmp[0]=arr[0]; ===> tmp[3, ]
DFS(L+1); //2. DFS(1); / if문에 해당안되므로 else문으로 와서 for문을 돌려야함 //5. DFS(1+1) ===> 젤 위에 if문에 해당되므로 push. //7. 얘도 마찬가지로 push
ch[i]=0;
}
} //8. D(1)의 for문은 다 돌았다. 그러므로 이제 DFS(0)의 남은 for문을 돌린다.
}
}
DFS(0);
return answer;
}
let arr=[3, 6, 9];
console.log(solution(2, arr));
</script>
3.感想
1時間近く見つめていたので理解しました...
Reference
この問題について(2022/04/19) 10. シーケンスを求めて[再帰関数と完全なナビゲーション(DFS:深度優先ナビゲーション)]), 我々は、より多くの情報をここで見つけました https://velog.io/@7lo9ve3/20220419-10.-순열-구하기-재귀함수와-완전탐색DFS깊이우선탐색テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol