简单 Haskell 斐波那契函数卡住了
Simple Haskell Fibonacci function gets stuck
我是 运行 GHCi 控制台,正在输入
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
然后
fib 5
控制台挂起并死掉:
: Out of memory
我做错了什么?
通过将声明分别键入 ghci,每个声明都被读取为 fib
的单独定义,隐藏其前身。换句话说,你实际上是 运行
fib n = fib (n-1) + fib (n-2)
fib 5 -- infinite recursion here
避免此问题的最简单方法是将 fib
的定义放入文件中。
在控制台,您还没有为 3 种不同的情况定义单个函数 fib
;您首先定义了 fib 0 = 0
,然后用 new 函数 fib 1 = 1
覆盖它,最后用没有基本情况的第三个函数 fib n = fib (n-1) + fib (n-2)
覆盖它。您可以使用
> fib 0 = 1; fib 1 = 1; fib n = fib (n-1) + fib (n-2)
正确定义一个 3-case 函数。
请注意,这主要是从 GHCi 8 开始出现的问题,因为在以前的版本中,您必须使用 let
来开始定义,并且会在第二行出现解析错误:
> let fib 0 = 0
> fib 1 = 1
<interactive>:3:7: parse error on input '='
我是 运行 GHCi 控制台,正在输入
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
然后
fib 5
控制台挂起并死掉:
: Out of memory
我做错了什么?
通过将声明分别键入 ghci,每个声明都被读取为 fib
的单独定义,隐藏其前身。换句话说,你实际上是 运行
fib n = fib (n-1) + fib (n-2)
fib 5 -- infinite recursion here
避免此问题的最简单方法是将 fib
的定义放入文件中。
在控制台,您还没有为 3 种不同的情况定义单个函数 fib
;您首先定义了 fib 0 = 0
,然后用 new 函数 fib 1 = 1
覆盖它,最后用没有基本情况的第三个函数 fib n = fib (n-1) + fib (n-2)
覆盖它。您可以使用
> fib 0 = 1; fib 1 = 1; fib n = fib (n-1) + fib (n-2)
正确定义一个 3-case 函数。
请注意,这主要是从 GHCi 8 开始出现的问题,因为在以前的版本中,您必须使用 let
来开始定义,并且会在第二行出现解析错误:
> let fib 0 = 0
> fib 1 = 1
<interactive>:3:7: parse error on input '='