2

f::[type]->[type]次のように大まかに定義された再帰的な関数が必要です。

要素が 1 つのリストから始まりますx。次に、3 つの「ジェネレーター関数」を適用して、 、 、および 、すべての関数を呼び出し generatorAgeneratorB何らかのgenerator C条件を受け入れる場合にそれらをリスト::type->typeに追加します。受け入れられた生成された数値ごとに、条件テストが false になるまで、 generator 、andおよび test 条件の適用を繰り返します。したがって、リストに受け入れられた要素ごとに、3 つの新しい要素が生成され、リストのテストが行​​われます。ABC

例は次のとおりです。

f::[int]->[Int]

generatorA x = x+1

generatorB x = 2x+1

generatorC x = 3x+1

条件: 合成数 (素数ではない) である必要があります。

計算f [10]を開始する必要があり、それをgeneratorA 10 = 11破棄します。

generatorB 10 = 21受け入れてから:

  • generatorA 21 = 22受け入れてから:
    • generatorA 22 = 23プライム廃棄。
  • generatorB 21 = 43破棄
  • generatorC 21 = 64受け入れる 等 等 等

質問: 関数をどのようにコーディングしますfか? どうやって始めたらいいのかわからない。私の最良の推測は

 f (x:xs)
       |condition==True   = (something something)
       |otherwise         = xs
       where
         a=generatorA x
         b=generatorB x
         c=generatorC x

ご協力いただきありがとうございます。

4

2 に答える 2

3

シングルトン リストで開始する場合は、引数として単一の値で開始することもできます。

ga x = [y | let y=x+1, composite y] >>= (\x-> x:f x)
gb x = [y | let y=2*x+1, composite y] >>= (\x-> x:f x)
gc x = [y | let y=3*x+1, composite y] >>= (\x-> x:f x)

f :: Integer -> [Integer]
f x = ga x ++ gb x ++ gc x

sを使用Integerして、オーバーフローの問題を回避します。テスト:

*Main> take 40 $ f 10
[21,22,45,46,93,94,95,96,289,290,291,292,585,586,1173,1174,1175,1176,1177,1178,1
179,1180,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,4741,4742,4743,4744,4
745,4746,4747,4748]

fより浅い方法で結果を生成するために実装することもできます。

import Data.List

f x = concat $ transpose [ga x, gb x, gc x]

テスト:

*Main> take 80 $ h 10
[21,22,64,45,65,46,129,91,66,136,130,93,196,92,259,273,133,94,388,183,393,274,26
1,187,134,274,260,820,589,280,777,93,267,275,391,95,394,184,519,1641,400,188,116
5,275,590,549,262,561,135,185,778,2461,1180,189,778,550,268,276,392,375,1179,549
,261,1642,801,841,1166,94,395,550,784,96,403,185,520,2462,1768,562,1555,276]
于 2013-04-27T01:21:02.887 に答える
2

Data.Tree.unfoldTree :: (b -> (a, [b])) -> b -> Tree a値のリストを作成するために使用します。次に、flatten事前注文が必要な場合、またはconcat . Data.Tree.levels幅優先の注文を行う場合に使用します。

f x = flatten $ unfoldTree (\b -> (b, filter composite (map ($ b) [ga, gb, gc]))) x

その要素が必要ない場合、このリストには最初のシード要素が含まれます。電話するだけtailです。

于 2013-04-27T07:51:08.650 に答える