根据输出功能设置输入设置的上限

Aev*_*eus 3 haskell list-comprehension

我目前仍然坚持在列表推导中设置上限.

我要做的是找到低于一百万的所有斐波纳契数.为此我设计了一个相当简单的递归Fibonacci函数

fib :: Int -> Integer
fib n
    n == 0    = 0
    n == 1    = 1
    otherwise = fib (n-1) + fib (n-2)
Run Code Online (Sandbox Code Playgroud)

我坚持的事情是定义一百万个部分.我现在得到的是:

[ fib x | x <- [0..35], fib x < 1000000 ]
Run Code Online (Sandbox Code Playgroud)

这是因为我知道Fibonacci序列中的第35个数字足够高.但是,我想要的是通过一个函数找到这个限制并设置它.

[ fib x | x <- [0..], fib x < 1000000 ]
Run Code Online (Sandbox Code Playgroud)

这确实给了我数字,但它根本不会停止.这导致Haskell试图在序列中找到进一步低于一百万的斐波纳契数,这是相当无效的.

任何人都可以帮我解决这个问题吗?非常感谢!

ant*_*kos 10

fib x < 1000000列表推导中的检查过滤掉fib x小于1000000 的值; 但是列表理解无法知道更大的价值x意味着更大的价值,fib x因此必须继续,直到所有的x都被检查.

takeWhile改为使用:

takeWhile (< 1000000) [ fib x | x <- [0..35]]
Run Code Online (Sandbox Code Playgroud)

  • `takeWhile(<1000000)[fib x | x < - [0 ..]]`也可以.这构造了所有斐波纳契数的无限列表,并取不到一百万个.根本不需要设置上限. (5认同)