递归是我一直在努力理解的东西。我希望我能在这里得到一些关于这个功能如何工作的帮助。它有效,但我想知道如何:
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))
答案 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)
}。
希望这有助于澄清一些事情。递归真的只是编写循环的另一种方式;它具有所有相同的元素,但写得有点不同。对于使用递归的一些问题,可以得到更简单的逻辑或代码,或者两者兼而有之。一旦你对递归更加熟悉,它将成为你未来编程的一个非常有用的工具。