_cuclife.com
当前位置:cuclife.com > IT > ASP.NET >

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#的运算符优先顺次,还是跟感觉有点偏差的。

文章来源:网络整理  本站编辑:兰特
上一篇:F#教程: 数值处理
下一篇:F#教程:while语句
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)