Chapter3 - 递归 - Recursion

 

递归表示定义的这个函数能够调用他自身。换句话说,这个函数

能在定义自己的时候再调用自己。

在函数式编程中经常会使用递归来代替循环。

大多数人认为,递归能够是你的代码跟容易让别人理解。

在F#中使用递归,我们只需要在定义的时候,在函数名前加上关键字

rec 即可,下面的例子就递归的用法(译者:虽然用递归这样来处理

斐波拉契数并不一定是个合适的选择)

 


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)


 

结果:

     (fib 2) = 1

    (fib 6) = 8

 

上面的函数计算第x个斐波拉契数的值。

斐波拉契数列的定义是:

    第n个值等于第n-1跟第n-2的和。

虽然函数的递归调用是非常强大并且能够容易理解的,但我们仍要小心的使用它,

因为他随时会造成函数无法退出,或者帧栈溢出的问题(译者:在操作系统中,每次函数调用时

使用的参数,其实都是会存储在该进程的帧栈中的,他同时也会用来保存当前的状态,

因为栈的先进后出原则是非常适合来做这些处理的,而在.net中,默认的帧栈分配是1M,

当栈满的时候,他就会抛出栈溢出异常 System.StackOverflowException)

 

ps:上面的递归调用其实也使用了,F#的另一个特性,就是模式匹配,我们会在后面的章节讲到

posted on 2010-09-17 08:35  兴说:  阅读(229)  评论(0编辑  收藏  举报