haskell - 在 Haskell 中编写带条件的递归函数 :

标签 haskell recursion tree

我想要一个函数f::[type]->[type],它的递归定义大致如下:

它以一个包含 1 个元素 x 的列表开始。然后它应用 3 个“生成器函数”让我们调用它们 generatorAgeneratorBgenerator C,所有函数 ::type->type,并将它们添加到列出如果他们接受某些条件。对于每个接受的生成数字,它重复应用生成器 ABC 并测试条件,直到条件测试为 false。因此,对于列表中接受的每个元素,将生成 3 个新元素并针对列表进行测试。

一个例子是:

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

感谢您的帮助。

最佳答案

如果它以单例列表开头,它也可能以单个值作为其参数开始。

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

我使用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]

关于haskell - 在 Haskell 中编写带条件的递归函数 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16247098/

相关文章:

java - 从表构造树

haskell - Free Pascal 有像 Haskell 那样的类型变量吗?

haskell - haskell中的高阶函数解谜函数

recursion - Clojure:只能从尾部位置重复

haskell - 用 foldr 构建平衡二叉树

python - 使用 Python 将分隔字符串和值转换为分层 JSON

haskell - 如何从 .xmonad/xmonad.hs 导入本地模块

haskell - 通过归纳证明指数运行时间

c - 当输入无效时如何递归要求输入?

c++ - 从前序遍历迭代构建二叉搜索树(非递归)