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)
 }
あまりすっきりした形ではないが、これでどうだろうか?意外に難しい。

0 件のコメント:

コメントを投稿