不使用 zipWith 的斐波那契数列

Jim*_*hoy 10 haskell fibonacci

我一直在尝试在不使用惰性zipwith方法的情况下实现从 0 到 n 的斐波那契数列列表。到目前为止,我所拥有的是将列表从n1返回到 1 的代码。有什么方法可以更改此代码,以便它从 0- 返回列表n

例子:

fib_seq 4 = [3,2,1,1] 
-- output wanted: [1,1,2,3]
Run Code Online (Sandbox Code Playgroud)

如果没有办法做我想让代码做的事情,有没有办法只返回斐波那契数字列表,再输入一个数字,再说 4 它将返回[0, 1, 1, 2].

fib_seq :: Int -> [Int]
fib_seq 0 = [0]
fib_seq 1 = [1]
fib_seq n = sum (take 2 (fib_seq (n-1))) : fib_seq (n-1)
Run Code Online (Sandbox Code Playgroud)

jpm*_*ier 5

通常情况下,您可以通过考虑稍微更通用的版本来解决问题。

假设我们想要从两个规定的初始值 a 和 b开始的无限斐波那契列表。有一个明显的递归解决方案:

$ ghci
GHCi, version 8.8.4: https://www.haskell.org/ghc/  :? for help
 ...
 ?> 
 ?> aux_fib a b = a : (aux_fib b (a+b))
 ?> 
 ?> take 4 (aux_fib 1 1)
 [1,1,2,3]
 ?> 
Run Code Online (Sandbox Code Playgroud)

所以:

 ?> 
 ?> fib_seq n = take n (aux_fib 1 1)
 ?> 
 ?> fib_seq 4
 [1,1,2,3]
 ?> 
Run Code Online (Sandbox Code Playgroud)

注意camel case在 Haskell 中被认为更惯用,所以它更像是auxFiband fibSeq


pro*_*exe 5

您可以选择实现 fib 数的另一种方法是使用辅助函数,然后使用它自己的函数来生成 fib 数的无限列表,或者您可以使用 take 10 fibs,其输出将是前 10 个骗子号码。我的函数绝对不是使用 zipWith 函数无限计算 fib 数的最快方法,但你在这里没有使用它,所以这是我在没有 zipWith 的情况下实现它的方法。

例如take 10 fibs会返回:[0,1,1,2,3,5,8,13,21,34]

fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)   

fibs :: [Int]
fibs = (map fib [0..])
Run Code Online (Sandbox Code Playgroud)