程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了不使用 zipWith 的斐波那契数列大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决不使用 zipWith 的斐波那契数列?

开发过程中遇到不使用 zipWith 的斐波那契数列的问题如何解决?下面主要结合日常开发的经验,给出你关于不使用 zipWith 的斐波那契数列的解决方法建议,希望对你解决不使用 zipWith 的斐波那契数列有所启发或帮助;

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

示例:

fib_seq 4 = [3,2,1,1] 
-- output wanted: [1,3]

如果没有办法做我想让代码做的事情,有没有办法只返回斐波那契数列的列表,再输入一个数字 4,它会返回 [0,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)

解决方法

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

假设我们想要以两个规定的初始值 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]
 λ> 

所以:

 λ> 
 λ> fib_seq n = take n (aux_fib 1 1)
 λ> 
 λ> fib_seq 4
 [1,3]
 λ> 

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

,

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

例如 take 10 fibs 会返回:[0,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..])
,

如果您想让列表从 0 开始,您可以使用辅助函数,然后在 fib_seq 中使用此辅助函数(我建议您将其更改为 Camel 大小写,例如 fibSeq、标准 Haskell 符号)

好的,因此 fibSeq 7 之后的函数将返回 [0,8]

fibHelp :: Int -> Int -> [Int]
fibHelp x y = x : (fibHelp y (x+y))

fibSeq :: Int -> [Int]
fibSeq n = take n (fibHelp 0 1)
,

感觉有点像作弊,但您可以像这样对斐波那契数列使用 closed formula:

fib n = (phi^n - psi^n) / sqrt 5
  where
    phi = (1 + sqrt 5) / 2
    psi = (1 - sqrt 5) / 2

fibSeq n = fib <$> [1 .. n]

否则 Haskell Wiki 有更多 implementation variants 可供选择。例如非常简洁

fibs = 0 : 1 : next fibs
  where
    next (a : t@(b:_)) = (a+b) : next t

大佬总结

以上是大佬教程为你收集整理的不使用 zipWith 的斐波那契数列全部内容,希望文章能够帮你解决不使用 zipWith 的斐波那契数列所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: