F#基础教程 递归
递归是指定义在自身上的函数,换句话说,函数的定义里调用自己。在函数式编程里,通常使用递归表示命令式编程里的循环,许多人认为递归比循环更容易理解算法。
要在F#里使用递归,在函数定义的let关键字后加rec关键字就可以在函数中使用函数名。下面给出一个示例
#light
let rec fib x =
match x with
| 1 -> 1
| 2 -> 1
| x -> fib (x - 1) + fib (x - 2)
printfn "(fib 2) = %i" (fib 2)
printfn "(fib 6) = %i" (fib 6)
printfn "(fib 11) = %i" (fib 11)
执行结果:
(fib 2) = 1
(fib 6) = 8
(fib 11) = 89
注意第四行开始的|相当于分支语句,在F#里其功能为模式匹配,将在以后章节介绍。这个函数计算一个Fibonacci序列。他的结果集如下 1, 1, 2, 3, 5, 8, 13, …. 递归最适合表示Fibonacci序列的算法。
虽然递归是一个功能强大的工具,但是要小心使用它。这是因为容易在不经意间写出一个递归,永远不会终止。如上的FIB函数,1和2的是基本分支,如果x大于或等于3,其亦会回基本分支;但如果x是小于1的,则x将持续调用更小值和更多的递归,直到计算机的极限。从而导致堆栈溢出。(System.StackOverflowException).