F#教程:递归


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


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3