ある教材でscalaを使い部分和を勉強しているのですが、教材のコードにprintln
を書き足して途中の値を追っても動きが理解出来ません。
object PartialSumDFS extends App { val a = Seq(3, 6, -5, 7) val n = a.length val k = 8 def isMatchAndResult(index: Int,partial: Seq[Int]): (Boolean,Seq[Int]) ={ println(s"① index:${index} partial:${partial}") if (index == n){ return if (partial.sum == k)(true,partial) else (false, Seq()) } val (isMatchNotAdd, resultNotAdd) = isMatchAndResult(index + 1, partial) if (isMatchNotAdd) return (isMatchNotAdd,resultNotAdd) println(s"② index:${index} partial:${partial}") isMatchAndResult(index + 1, partial :+ a(index)) } val(isMatch,result) = isMatchAndResult(0,Seq()) if(isMatch) println(s"Yes ${result}") else println("No") }
これが教材のコード(println
は自分で追加)で、実行したら
① index:0 partial:List() ① index:1 partial:List() ① index:2 partial:List() ① index:3 partial:List() ① index:4 partial:List() ② index:3 partial:List() ① index:4 partial:List(7) ② index:2 partial:List() ① index:3 partial:List(-5) ① index:4 partial:List(-5) ② index:3 partial:List(-5) ① index:4 partial:List(-5, 7) ② index:1 partial:List() ① index:2 partial:List(6) ① index:3 partial:List(6) ① index:4 partial:List(6) ② index:3 partial:List(6) ① index:4 partial:List(6, 7) ② index:2 partial:List(6) ① index:3 partial:List(6, -5) ① index:4 partial:List(6, -5) ② index:3 partial:List(6, -5) ① index:4 partial:List(6, -5, 7) Yes List(6, -5, 7)
という結果が返ってきました。上から5行目まではindexが3になるまで再帰関数がisMatchAndResult(index + 1, partial)
により繰り返し呼び出されたためで、6-7行目はindexが3のときのisMatchAndResult(index + 1, partial)
の結果がfalseになったので後続のコードが引き続き実行された結果とわかるのですが、8行目でindexに2が代入されている理由がわかりません。
index=2となるような計算式が見当たらないのですが、どこからきたのでしょうか…。
回答1件
あなたの回答
tips
プレビュー