Chapter3 - 递归 - Recursion
时间:2010-09-17 来源:兴说:
递归表示定义的这个函数能够调用他自身。换句话说,这个函数
能在定义自己的时候再调用自己。
在函数式编程中经常会使用递归来代替循环。
大多数人认为,递归能够是你的代码跟容易让别人理解。
在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#的另一个特性,就是模式匹配,我们会在后面的章节讲到
相关阅读 更多 +