我不明白Fibonacci对haskell函数给出(元组)

时间:2011-05-17 00:20:44

标签: haskell recursion tuples fibonacci

递归是我一直在努力理解的东西。我希望我能在这里得到一些关于这个功能如何工作的帮助。它有效,但我想知道如何:

fibStep :: (Int,Int) -> (Int,Int)
fibStep    (u,  v)    = (v,  u+v)

fibPair :: Int -> (Int,Int)
fibPair n
    | n==0      = (0,1)
    | otherwise = fibStep (fibPair (n-1))

2 个答案:

答案 0 :(得分:3)

通常,当您进行递归时,请尝试向后并使用较小的值,例如,如果我们通过n = 0的fibPair,它会立即返回(0,1)

然后,如果n = 1,我们得到,

fibPair 1 = fibStep (fibPair 0) = fibStep (0, 1) = (1,1)

然后,我们得到n = 2,

fibPair 2 = fibStep (fibPair 1) = fibStep (1,1) = (1,2)

所以,正如我们所看到的,它通过从(0, 1)提出来给你第n对斐波那契序列。

如果您仍然不了解它,请尝试完全展开fibPair 2(即展开fibStep (fibPair 1)

答案 1 :(得分:2)

递归的工作方式与循环非常相似。对于循环,您有一个停止条件,递归也是如此,除了它被称为基本情况。在这个Fibonacci示例中,基本情况是n==0,它返回元组(0,1) - 当然这代表第一个Fibonacci数。

在确定基本案例之后,现在需要弄清楚递归步骤 - 在此示例中它是fibStep (fibPair (n-1))。这相当于循环的代码块,或者在每次迭代时重复的步骤,直到达到基本情况为止。当然,确保始终收敛到基本情况至关重要,否则递归将永远不会结束 - 在示例中,递归步骤会收敛到基本情况,因为对于每个连续步骤,{的值{1}}减1,这意味着我们必须最终达到n(假设n==0最初为正数)的情况。

让我们看一下n的评价。每个连续的行是前一个的扩展,使用示例中提供的定义。

fibPair 3

重要的是,您应该对所发生的事情的英语解释感到满意。 fibPair 3 **note: n is not 0 so we use the recursive step fibStep (fibPair (3-1)) fibStep (fibPair 2) **note: n is not 0 use recursive step again fibStep (fibStep (fibPair (2-1))) fibStep (fibStep (fibPair 1)) **note: n is not 0 use recursive step again fibStep (fibStep (fibStep (fibPair (1-1)))) fibStep (fibStep (fibStep (fibPair 0))) **note: n equals 0 so base case is used ** recursion has now ended fibStep (fibStep (fibStep (0,1))) **note: now fibStep begins evaluation fibStep (fibStep (1, 1)) fibStep (1, 2) (2, 3) 采用fibStep元组并按顺序返回下一个元组,即(fib number x, fib number x+1)(fib number x+1, fib number x+2)充当fibPair的循环,导致fibStep在同一元组上被调用fibStep次,这意味着元组n将导致为(fib number x, fib number x+1) }。

希望这有助于澄清一些事情。递归真的只是编写循环的另一种方式;它具有所有相同的元素,但写得有点不同。对于使用递归的一些问题,可以得到更简单的逻辑或代码,或者两者兼而有之。一旦你对递归更加熟悉,它将成为你未来编程的一个非常有用的工具。