Haskell中的迭代计算
我是Haskell的初学者,我试图在Haskell中创建一个无限列表,其中下一个术语可以通过以下公式找到Haskell中的迭代计算,haskell,Haskell,我是Haskell的初学者,我试图在Haskell中创建一个无限列表,其中下一个术语可以通过以下公式找到 xn+1 = (xn + const / xn) div 2. 我一直在研究iterate命令,因为我想再次应用相同的函数来生成下一个答案 然后我将使用take从列表中选择一定数量的元素 但是,我不确定在使用iterate时如何表示xn 我开始写take 10(iterate(xn+5/xn div 2)1),我知道我需要替换xn,但不确定用什么替换 谁能给我个建议吗?只要使用lambda
xn+1 = (xn + const / xn) div 2.
我一直在研究iterate命令,因为我想再次应用相同的函数来生成下一个答案
然后我将使用take从列表中选择一定数量的元素
但是,我不确定在使用iterate时如何表示xn
我开始写take 10(iterate(xn+5/xn div 2)1)
,我知道我需要替换xn,但不确定用什么替换
谁能给我个建议吗?只要使用
lambda
功能:
mySeq = iterate (\xn ->(xn + 5 `div` xn) `div` 2) 1
next xn = (xn + c) / (2*xn)
这里有一个只需使用一个
lambda
函数:
mySeq = iterate (\xn ->(xn + 5 `div` xn) `div` 2) 1
next xn = (xn + c) / (2*xn)
这里有一个您基本上描述了一个函数:
mySeq = iterate (\xn ->(xn + 5 `div` xn) `div` 2) 1
next xn = (xn + c) / (2*xn)
使用c
时,const
(const
是前奏曲中的一个函数,因此不要使用该名称)。或者作为lambda表达式:
\xn -> (xn + c) / (2*xn)
用c
你的常数。现在我们可以在迭代中插入它:
take 10 (iterate (\xn -> (xn + 5) / (2*xn)) 1)
使用c=5
,我们得到:
Prelude> take 10 (iterate (\xn -> (xn + 5) / (2*xn)) 1)
[1.0,3.0,1.3333333333333333,2.375,1.5526315789473684,2.110169491525424,1.684738955823293,1.9839094159713946,1.7601381796335236,1.9203430326819695]
如果要计算整数的值,可以使用:
\xn -> div (xn + c) (2*xn)
这将产生:
Prelude> take 10 (iterate (\xn -> div (xn + 5) (2*xn)) 1)
[1,3,1,3,1,3,1,3,1,3]
Prelude> take 10 $ iterate (\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))) 1
[1,3,1,3,1,3,1,3,1,3]
如果要在计算后对结果进行四舍五入,可以使用floor
:
\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))
这将产生:
Prelude> take 10 (iterate (\xn -> div (xn + 5) (2*xn)) 1)
[1,3,1,3,1,3,1,3,1,3]
Prelude> take 10 $ iterate (\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))) 1
[1,3,1,3,1,3,1,3,1,3]
您基本上描述了一个函数:
mySeq = iterate (\xn ->(xn + 5 `div` xn) `div` 2) 1
next xn = (xn + c) / (2*xn)
使用c
时,const
(const
是前奏曲中的一个函数,因此不要使用该名称)。或者作为lambda表达式:
\xn -> (xn + c) / (2*xn)
用c
你的常数。现在我们可以在迭代中插入它:
take 10 (iterate (\xn -> (xn + 5) / (2*xn)) 1)
使用c=5
,我们得到:
Prelude> take 10 (iterate (\xn -> (xn + 5) / (2*xn)) 1)
[1.0,3.0,1.3333333333333333,2.375,1.5526315789473684,2.110169491525424,1.684738955823293,1.9839094159713946,1.7601381796335236,1.9203430326819695]
如果要计算整数的值,可以使用:
\xn -> div (xn + c) (2*xn)
这将产生:
Prelude> take 10 (iterate (\xn -> div (xn + 5) (2*xn)) 1)
[1,3,1,3,1,3,1,3,1,3]
Prelude> take 10 $ iterate (\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))) 1
[1,3,1,3,1,3,1,3,1,3]
如果要在计算后对结果进行四舍五入,可以使用floor
:
\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))
这将产生:
Prelude> take 10 (iterate (\xn -> div (xn + 5) (2*xn)) 1)
[1,3,1,3,1,3,1,3,1,3]
Prelude> take 10 $ iterate (\xn -> floor ((fromIntegral xn + 5) / (2* fromIntegral xn))) 1
[1,3,1,3,1,3,1,3,1,3]
它是div(xn+const/xn)2
div
不是运算符,所以您不能使用它的中缀(没有backtics),我在这里删除了它们,因为当我这样做时,它将div从代码列表中删除。@JamesHamish您必须在引号前面加一个反斜杠来逃避引号:`div`
通过在引号周围加两个反斜杠来引用包含代码的反斜杠。它是div(xn+const/xn)2
div
不是运算符,所以您不能使用它的中缀(没有backtics),我在这里删除了它们,因为当我这样做时,它从代码列表中删除了div。@JamesHamish您必须在引号前面加一个反斜杠来逃避引号:`div`
通过在引号周围加上双反斜杠来引用包含代码的反斜杠。问题是我使用div进行整数除法和舍入,分割后,您正在使用/您不能同时使用div
和/
并获得相同的类型,因为(/)::分数f=>f->f->f
和div::Integral i=>i->i
。虽然从技术上讲我们可以构造这样一个类型,但是让一个类型同时检查括号是否是您想要的,这是非常奇怪的。浮点数比整数更有意义。问题是我使用div进行整数除法和舍入,当你除法后,你就使用了/你不能同时使用div和/
并获得相同的类型,因为(/)::分数f=>f->f->f
和div::Integral i=>i->i->i
。虽然从技术上讲我们可以构造这样一个类型,但是让一个类型同时检查括号是否是您想要的,这是非常奇怪的。浮点数比整数更有意义。