您的位置:首页 > 其它

F#入门-第二章 F#基础-第五节 let语句-函数定义

2010-08-16 15:02 344 查看
    let语句不仅可以用来将值绑定给变量,也可以用来进行函数定义。

函数定义
//定义加1函数f

let f x = x+1;;

//调用函数f。返回4。

f 3;;

//调用函数f。返回6。

f 5;;

    在上面这个例子中,将3或5等数值作为参数传递给函数f并调用该函数。
    函数定义时,具体的数值还没有决定下来,称作形式参数,上例中为x。   
    上例中,3获5称作实际参数。
    同时,作为函数执行结果返回的值称作函数的返回值。
    使用这些用语,可以对函数进行如下定义。

 函数定义    let     函数名     形式参数1     形式参数2 ... =函数内容

    同时,明确定义参数类型时可以做如下定义.

 函数定义    let     函数名     (形式参数1:数据类型)     (形式参数2:数据类型) ... =函数内容

    定义形式参数时可以采取各种许多不同的形式。

带两个参数的函数的定义
//定义执行加法运算的函数add

let add x y = x + y;;

//函数同上,不同写法

//let add left right = left + right;;

//调用add函数,返回3

add 1 2;;

//调用add函数,返回7

add 3 4;;

//调用add函数,返回0。注意参数为负数的时候必须要加括弧。

add (-10) 10;;

    上例为带两个参数的函数add的定义方法。

指定参数数据类型的函数
let f (x:float) = x + 1.;;

    上例为指定参数类型为float型的函数的定义方法。

    同时,使用let rec语句可以定义递归函数。
    递归函数是指函数体内调用函数自身的函数。
    举例如下

求阶乘函数
let rec fact n =

if n=1 then 1

else n * fact (n-1) in

fact 5;;

    上例中的阶乘函数是典型的递归函数。函数体内调用函数自身,虽然理解起来稍微有点困难,但是实际开发中,需要使用到递归函数的地方是非常多的。例如最常用的windows操作系统中的文件目录遍历。当需要显示出某一个文件目录下的所有文件与子目录,使用递归函数是最恰当与最方便的。

    不加rec,直接用let定义递归函数是错误的,如下所示。

忘记加rec,引发错误
let fact n = if n=1 then 1 else n * fact (n-1) in fact 5;;

error: FS0039: The value or constructor 'fact' is not defined.

    关于这里出现的if条件分歧语句,在后面几节中进行说明。

关于常州蓝博纺织机械有限公司的产品被常州蓝博节能设备有限公司非法假冒的声明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息