gpt4 book ai didi

haskell - ruby while 循环转换为 haskell

转载 作者:行者123 更新时间:2023-12-02 00:22:56 25 4
gpt4 key购买 nike

我刚刚开始学习一些 Haskell 和函数式编程,但我发现很难掌握它:)

我正在尝试翻译一小段ruby向 Haskell 编写代码(因为我喜欢函数式编程和 Haskell 提出的概念,更重要的是因为我来自数学领域,Haskell 看起来非常数学化):

class Integer
def factorial
f = 1; for i in 1..self; f *= i; end; f
end
end

boundary = 1000
m = 0

# Brown Numbers - pair of integers (m,n) where n factorial is equal with square root of m

while m <= boundary

n = 0

while n <= boundary
puts "(#{m},#{n})" if ((n.factorial + 1) == (m ** 2))
n += 1
end

m += 1
end

我只能弄清楚如何进行阶乘:

let factorial n = product [1..n]

我无法弄清楚如何在 Haskell 中执行 while 循环或等效操作,尽管我发现了一些让我感到困惑的示例。

这个想法是循环从0(或1)开始并继续(增量为1)直到到达边界(在我的代码中是1000)。存在边界的原因是因为我正在考虑启动执行相同操作但时间间隔不同的并行任务,以便更快地返回我期望的结果(一个操作将在 110000,另一个在 10000100000 等)。

如果有人能帮忙解决这个问题,我将非常感激:)

最佳答案

试试这个:

let results =  [(x,y) | x <- [1..1000], y <- [1..1000] ,1 + fac x == y*y]
where fac n = product [1..n]

这是一个列表理解。更多信息here .

要将其映射到您的 Ruby 代码,

  1. mn 中的嵌套循环被替换为 xy。基本上,在指定范围内(本例中包括 1 到 1000)对 xy 的值进行迭代。
  2. 最后的检查是获取布朗数的过滤条件。
  3. where 允许我们创建一个辅助函数来计算阶乘。

请注意,我们可以就地计算阶乘,而不是单独的函数,如下所示:

(1 + product[1..x]) == y * y

最终,左侧的 (x,y) 意味着它返回一个元组列表 (x,y),它们是您的布朗数。

好的,这应该适用于您的 .hs 文件:

results :: [(Integer, Integer)] --Use instead of `Int` to fix overflow issue
results = [(x,y) | x <- [1..1000], y <- [1..1000] , fac x == y*y]
where fac n = product [1..n]

关于haskell - ruby while 循环转换为 haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24862938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com