【发布时间】:2011-07-12 02:57:49
【问题描述】:
刚从 Haskell 开始,我把这个丑陋的部分放在一起来确定一个列表中可以被一个数字整除的数字以及所有小于它的数字。
divis :: (Integral a) => a -> [a] -> [a]
divis _ [] = []
divis n (x:xs)
| x `mod` n == 0 && n == 2 = x : divis n xs
| x `mod` n == 0 = divis (n-1) [x] ++ divis n xs
| otherwise = divis n xs
我可以这样称呼它......
head (divis 10 [1..])
获取列表中的第一个数字,在本例中为 2520。但是,这似乎不足以使用更高的数字(如 20)有效地解决。
我怎样才能修复这个haskell 的raskell?
【问题讨论】:
-
+1 表示“haskell 的 raskell”
-
我的第一印象是该算法可能无法提高效率 - 列表中的每个 k 数字直到第一个结果都必须针对所有2 和 n 之间的 n-1 整数,所以这看起来至少是一个二次解。当你考虑到 k 到 n 的关系是超线性的,这看起来像
O(n^3)左右...... -
非常感谢您查看,问题开始于我没有通过 [x] 递归或知道如何完成它,但是在我输入我的问题之后,我能够提出它在一起,但是运行它来解决问题需要很长时间,所以我想我还是会问一下,以防我实现了一个糟糕的算法。
标签: haskell recursion functional-programming