Haskell 如何创建一个函数来生成一个整数序列的无限列表,该整数序列由两个初始数X_0和X_1递归定义
假设我有以下整数序列的递归定义:Haskell 如何创建一个函数来生成一个整数序列的无限列表,该整数序列由两个初始数X_0和X_1递归定义,haskell,recursion,sequence,Haskell,Recursion,Sequence,假设我有以下整数序列的递归定义:a\u 0=5,a\u n=2a\u 0+3->5,13,29,61125… 我想使用Haskell中的iterate函数来生成这个序列的无限列表。为此,我可以编写以下代码: intSequence::Integer->Integer->[Integer] intSequence a0 m=迭代下一步a0 其中nextNum a=2*a+m ghci>let an=intSequence 5 3 ghci>采取5 a [5,13,29,61,125] 现在让
a\u 0=5,a\u n=2a\u 0+3
->5,13,29,61125…
我想使用Haskell中的iterate
函数来生成这个序列的无限列表。为此,我可以编写以下代码:
intSequence::Integer->Integer->[Integer]
intSequence a0 m=迭代下一步a0
其中nextNum a=2*a+m
ghci>let an=intSequence 5 3
ghci>采取5 a
[5,13,29,61,125]
现在让我们假设我有以下内容:
X_n=X_n-1*m_1+X_n-2*m_2+a
现在,我想创建一个函数,用以下方式调用:
intSequence x0 x1 m1 m2 a
它返回一个序列的无限列表,该序列遵循上述定义的规则
例如:对于参数X0=1,X1=2,m1=2,m2=0,a=0
我们得到Xn=X_n-1*2+X_n-2*0+0=X_n-1*2
,它给出了[1,2,4,8,16,…]
另一个例子:对于参数X0=0,X1=1,m1=1,m2=1,a=0
我们得到斐波那契序列X_n=X_n-1*1+X_n-2*1+0=X_n-1+X_n-2
,它给出了[0,1,1,2,3,5,8,
如何使用iterate
实现此intSequence
函数
我尝试了以下不符合预期的操作:
intSequence::Integer->Integer->Integer->Integer->Integer->Integer->Integer->[Integer]
intSequence x0 x1 m1 m2 a=x0:x1:iterate(nextNum x0)x1
哪里
下一步x0'x1'=x1'*m1+x0'*m2+a
ghci>a=intSequence 0 1 0
ghci>每天10次
[0,1,1,1,1,1,1,1,1,1]
这显然是不正确的,符合逻辑的,所以我从不改变x0
和x1
是什么。我想我需要以某种方式使用递归,但我就是不知道如何使用。我是否应该根本不使用迭代?使用递归更容易:
——递归的辅助函数
intSequence':(积分a)=>(a,a)->a->a->a->a->[a]
--p2是X_n-2,p1是X_n-1
intSequence'(p2,p1)m1 m2 a=
--使用X_n-1作为新的X_n-2和当前项作为新的X_n-1进行递归
cur:intSequence'(p1,cur)m1 m2 a
--计算序列中的当前项
其中cur=p1*m1+p2*m2+a
--正确设置以前的术语,并将它们预先添加到序列中
intSequence::(积分a)=>a->a->a->a->a->a->[a]
intSequence x0-x1-m1-m2 a=x0:x1:intSequence'(x0,x1)m1-m2 a
啊,当然了,现在我已经看到了,这是如此简单和琐碎。。。非常感谢你!