找到所有可以表示为两个自然数的根的总和的二值数

时间:2017-11-20 17:34:14

标签: list haskell integer

任务是使用列表生成器找到可表示为两个自然数的根的总和的所有二值数,并打印所有这些组合+列表的长度。我明白了:

import Data.List

func = filter (>9) (takeWhile (<100) (nub [floor (sqrt (x) + sqrt (y)) | x <- [0..], y <- [0..]]))
l = length func

如何打印每个组合,而不仅仅是结果?

1 个答案:

答案 0 :(得分:3)

我怀疑&#34;我如何打印每个组合?&#34;,你的意思是&#34;我如何获得给我的xy值适当的总和?&#34;。最小的修复方法是让列表理解返回xy和一次性总和,并修改您的filterdropWhile以忽略{{1} }和x位。因此:

y

您可能还会感兴趣nubBy。然而,仍然有许多&#34; thinkos&#34;你应该一次解决一个问题:

  1. func = id . filter (\(x,y,sum) -> sum > 9) . takeWhile (\(x,y,sum) -> sum < 100) . nub $ [(x,y,floor (sqrt (x) + sqrt (y))) | x <- [0..], y <- [0..]] 是一个坏名字;这个名字意味着它是一个函数,它不是真的。
  2. 您没有检查func是否添加到整数;相反,你强迫他们的总和是一个整数。
  3. 您的迭代策略绝不会选择除sqrt以外的x。您应该通过已知的最坏情况限制迭代的上限,例如:由

    0

    或应用another of my answers中描述的修补程序。

  4. 一旦修复了前一位,您会注意到总和不是单调增加的。这意味着您决定何时停止的x <- [0..100^2], y <- [0..100^2] 策略将不正确。
  5. 一旦你有一些练习修复这个算法,你应该重新考虑这是否是正确的算法使用。 (即为什么我们要迭代那些不是正方形的takeWhilex值?)