Chapter3 - 递归 - Recursion

本文介绍了F#语言中递归的基本概念及其应用,并通过计算斐波那契数列的示例展示了如何在F#中实现递归函数。此外,文章还讨论了递归调用可能导致的问题。
 

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

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

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

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

在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#的另一个特性,就是模式匹配,我们会在后面的章节讲到

转载于:https://www.cnblogs.com/SinSay/archive/2010/09/17/1828861.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值