2015年5月17日日曜日
scala関数デザイン&プログラミング P54
Exercise 3.24 Listに別のListがサブシーケンスとして含まれるかどうか調べるhasSubsequenceを実装せよ
def hasSubsequence[A](sup:List[A],sub:List[A]):Boolean =
(sup,sub) match {
case (Nil,_) => false
case (_,Nil) => true
case (Cons(x,xs),Cons(y,ys)) => if (x==y) hasSubsequence(xs,ys) else hasSubsequence(xs,sub)
}
としてみたが、間違いに気づいた。最初に、 case (_,Nil) => trueをもってこないと、うまくいかない。
def hasSubsequence[A](sup:List[A],sub:List[A]):Boolean =
(sup,sub) match {
case (_,Nil) => true
case (Nil,_) => false
case (Cons(x,xs),Cons(y,ys)) => if (x==y) hasSubsequence(xs,ys) else hasSubsequence(xs,sub)
}
これでも、まだ完全ではない。途中までx==yだと、ysに半端なListが行くため、もともとのsubにリセットされない。
そこで、次のようにしてみた。
def hasSubsequence[A](sup:List[A],sub:List[A]):Boolean =
{
def icchi(supx:List[A],subx:List[A]):Boolean =
(supx,subx) match {
case (_,Nil) => true
case (Nil,_) => false
case (Cons(x,xs),Cons(y,ys)) => if (x==y) icchi(xs,ys) else icchi(xs,sub)
}
icchi(sup,sub)
}
あまりすっきりした形ではないが、これでどうだろうか?意外に難しい。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿