2016-11-20 16 views
0

これは2週間前の私たちの宿題の0ポイントの質問でしたので、宿題のように見える場合は反転しないでください。 これは、別の文字列内のString(その順序で)を見つけることです。単語の一部が見つかりません

isPart:: Eq a => [a] -> [a] -> Bool 
isPart [] _ = True 
isPart _ [] = False 
isPart (x:xs) (y:ys) 
    | x == y = moveone xs ys 
    | otherwise = isPart (x:xs) ys 

moveone:: Eq a => [a] -> [a] -> Bool 
moveone [] _ = True 
moveone (x:xs) (y:ys) 
    | x == y = moveone xs ys 
    | otherwise = isPart (x:xs) ys 

ので、私は「家」「ツリーハウス」それは本当でなければなりませんが、それは私がisPart入力する必要がない場合、「家」を「Treheouse」

私は問題を抱えていますisPartを入力する場合に一度Charがmoveoneのリストから削除されていることがわかるので、hが見つかると関数は "ouse"だけを探します。

私は文字列を保存して元に戻すことはできません。それを解決しないでください、単に私にアイデアを与えてください。

答えて

1

あなたはこれを試すことができます。

  1. まず文字が異なる場合には、あなたがmoveoneからFalseを返します。 isPartからの代わりに、単にmoveoneは代替を追加呼び出すの

  2. 次に、:

    | x == y = (moveone xs ys) || isPart (x:xs) ys 
    

ため任意の文字だけでなく、最初の1で失敗する可能性が一致します。

x-listのパターンエイリアスをisPart[email protected](x:xs)に追加します。それ以外の場合は、各再帰呼び出しのリストを再構成します。 (コンパイラが最適化するかもしれませんが)

関連する問題