2016-04-26 5 views
-1

私はHaskellでBurrows-Wheeler変換を実装しています。すべての循環された文字列の組み合わせが生成され、変換の第1ステップとしてマトリックスに格納される。私はHaskell Listを使って行列を構築しています。リストには元の単語がリストの頭に、その循環的な組み合わせがテールに格納されます。Haskellのリストを変更して追加する

Here is an Example of a transformed word

私が最初に循環した文字列を出力する関数を書かれています。しかし、関数を再帰として呼び出すと、無限ループに直面します。ここで

は、私が何をしないのです機能

type BWT = [String] -- List of Strings for Burrows Wheeler matrix 
samplebwt = ["BANANA$"] -- Sample input 

rotateBWT:: BWT -> BWT 
rotateBWT a = if (head (last a)) /= '$' 
    then [tail (head a) ++ [head (head a)]] ++ rotateBWT [tail (head a) ++ [head (head a)]] 
    else a 

    rotateBWT samplebwt 
-- returns ["ANANA$B"] 
--expected output ["ANANA$B", "NANA$BA", "ANA$BNA", "NA$BANA", "A$BANAN", "$BANANA"] 

のですか?

+0

をペンと紙で入力 – jberryman

+1

あなたのコードは(すべての組み合わせを生成しますが最後のものを複製しますが)あなたが思っているコードを実行していないことは明らかです。 – user2407038

答えて

1

$文字が含まれていない文字列でrotateBWTを呼び出すと、無限ループに陥ることがあります。そこ

あなたが例に示してきた出力を生成ソリューションがあります。

type BWT = [String] -- List of Strings for Burrows Wheeler matrix 

genBWTmatrix :: String -> BWT 
genBWTmatrix str = rotateBWT [str ++ "$"] 

rotateBWT :: BWT -> BWT 
rotateBWT a = if (head l) == '$' then a 
       else a ++ rotateBWT n 
       where l = last a 
         n = [(tail l) ++ [head l]] 

main = mapM_ putStrLn $ genBWTmatrix "BANANA" -- Prints: BANANA$ 
               --   ANANA$B 
               --   NANA$BA 
               --   ANA$BAN 
               --   NA$BANA 
               --   A$BANAN 
               --   $BANANA 

Run it

がアップ個別にテストすることができる小さな部分にあなたのコードを壊すか、慎重に評価をトレース
関連する問題