F#教程:递归 - 面向对象网 f# 学习 对象 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > OOP语言 > F# > 正文

F#教程:递归

来源: www.bianceng.cn 阅读:

目前为止我们已经学习了if、for 、while等语句,这样我们就可以尝试写一些简单的程序了。

我们就试着写一个计算从1到指定数总和的程序吧。首先定义个从键盘读取指定值作为输入参数的SumTotal函数。

#light
let SumTotal n =
         let mutable ttl = 0
         for i = 1 to n do
              ttl <- ttl + i
         ttl
let s = stdin.ReadLine()
let num = System.Int32.Parse(s)
printfn "%d" (SumTotal num)

使用mutable就可以使得ttl成为可变的变量了。

有一行仅有ttl的代码,作用同C#的return ttl相同。

键盘的输入可以通过stdin.ReadLine实现。

由于还不知道从字符串到数值变换的方法,就先用下.NET Framework的Int32.Parse吧。

虽然这样实现了要求,但F#中应该尽量避免使用变量的再赋值。我们就试着改写下上述代码吧!这样好像只能使用递归处理了。定义递归函数的时候应该使用rec关键字。

let rec SumTotal n =
         if n = 1 then 1
         else n + SumTotal (n-1)
let s = stdin.ReadLine();
let num = System.Int32.Parse(s)
printfn "%d" (SumTotal num)

看了这样的代码,是不是和求和的数学定义很相似啊?

x = 1 : f(x) = 1
x > 1 : f(x) = x + f(x-1)

根据这样的定义很容易就可以得到上述的 SumTotal函数了。

else部分的代码如果改写成:

else n + SumTotal n-1

这样就会造成无限循环并导致StackOverflow。最后一行中printfn的参数也是这样。看来对于F#的运算符优先顺次,还是跟感觉有点偏差的。

Tags:
相关文章列表: