【问题标题】:Find all two-valued numbers representable as the sum of the roots of two natural numbers找出所有可表示为两个自然数的根之和的二值数
【发布时间】:2023-03-31 18:15:02
【问题描述】:

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

import Data.List

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

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

【问题讨论】:

  • 几天/几周前你不是已经问过这个问题了吗?
  • 哦...是的,这是相同的任务,但不同的问题。我应该怎么办?编辑/删除上一个问题?
  • 每个(自然)数都是另一个自然数的根。你确定你已经理解任务描述了吗?
  • 现在我明白了。编辑过的问题,因为仍然不知道如何打印每个组合

标签: list haskell integer


【解决方案1】:

我怀疑“如何打印每个组合?”,您的意思是“我如何获得给我适当总和的 xy 值?”。最小的解决方法是让列表理解同时返回xy 和总和,并修改您的filterdropWhile 以忽略xy 位。因此:

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..]]

还有一个您可能感兴趣的nubBy。但是,您仍然需要解决许多“想法”,一次一个:

  1. func 是个坏名字;顾名思义,它是一个函数,这是不正确的。
  2. 您没有检查sqrts 是否添加到整数;相反,您将它们的总和强制为整数。
  3. 您的迭代策略永远不会选择x 而不是0。您应该通过已知的最坏情况来限制迭代的上限,例如由

    x <- [0..100^2], y <- [0..100^2]
    

    或应用another of my answers 中描述的修复。

  4. 修复前一位后,您会注意到总和不是单调递增的。这意味着您决定何时停止的takeWhile 策略将不正确。
  5. 一旦您对修复此算法进行了一些练习,您应该重新考虑这是否是要使用的正确算法。 (即,为什么我们要迭代这么多不是正方形的 xy 值?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多