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).

posted @ 2011-11-22 17:32  银河系漫游指南  阅读(426)  评论(0编辑  收藏  举报