[Swift]DFSアプリケーション


SWIFTによるDFSの実装
1.問題の説明
この問題は私が直接最初のDFS問題を応用したことがある.
長さ3の数値配列がある場合は、重複ではなく生成可能なすべての数値配列を出力します.
2.私の回答
import Foundation

func solution(_ numbers:[Int]) {
    var lv: Int = 0
    var cnt: [Int] = [0,0,0]
    var ret: [Int] = []
    func D(_ n: Int) {
        if lv == 3 {
            print(ret)
            } else {
            for i in 0..<cnt.count {
                if cnt[i] != 1 {
                    cnt[i] = 1
                    lv += 1
                    ret.append(numbers[i])
                    D(i+1)
                    lv -= 1
                    cnt[i] = 0
                    ret.removeLast()
                }
            }
        }
    }
    D(1)
}
3.解答説明
前回の質問では、数字の配列の長さは2です.今回は3で少し拡張し、春が同時に繰り返されるほか、少し難易度を上げました.
lvは現在いくつかの段階に入っている.
前回の問題にはlvという概念はありません.理由は繰り返しが許されるからです.過去の解釈がlvを使用していない理由を詳しく説明しましょう.
ターゲット番号に重複する属性が許可されている場合を表示します.
最初は,空配列のcnt=[]が実際にlvの役割を果たしていると考えられる.
cntにcntを加えるappend(1)cntを作りましたcount==lengthになると、lvの代わりに車を返す役割を果たすことができます.これは、繰り返しが許可されている場合にのみ使用できます...
もちろん、重複が許されなくてもLvを用いずにDFSを実現することができる.私がこの方法をお勧めしない理由から見ると、
この問題に例を加えたとする[5.2.3].
cntの変化過程から見ると、
[0, 0, 0] -> [1, 0, 0] -> [1, 1, 0] -> [1, 1, 1] -> [1, 1, 0]
ここを見るともうcntcount==3なので、lvキャラクターに代わるものは何もありません.
Q.[1,1]に並べば、車に戻ってはいけませんか?
そうだ.ただし、現在の長さが3のみで、その後、長さが100を超える配列に入ると、各サイクルのcntの0から100までの数に異常が発生する可能性があります.Lv+=1を追加してLv=数値を続行したほうがいいです.カウントになるとリターンが速さを上げるのに役立つのかな….