目前为止我们已经学习了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#的运算符优先顺次,还是跟感觉有点偏差的。