函数程序设计实验二:递归练习

module HW where

{-
1. 定义求两个非负整数最大公因子的函数:
mygcd ::Integer ->Integer ->Integer
-}
mygcd ::Integer ->Integer ->Integer
mygcd a 0=a
mygcd a b=mygcd b (mod a b)

{-
2. 定义阶乘函数
fac :: Integer -> Integer
-}
fac :: Integer -> Integer
fac 0=1
fac n=n* fac (n-1)

{-
3. 定义下列函数:
sumFacs :: Integer -> Integer
使得sumFacs n = fac 0 + fac 1 + ... + fac n
-}
sumFacs :: Integer -> Integer
sumFacs 0=fac 0
sumFacs n=fac n+sumFacs (n-1)

{-
4. 上述函数sumFacs可以对输入n返回和fac 0 + fac 1 + ... + fac n。
任意给定一个函数f, 一个非负整数n, 能否求出和f 0 + f 1 + ... + f n呢?
答案是肯定的。请您定义这样的函数:
sumFun :: (Integer -> Integer) -> Integer -> Integer
使得sumFun f n = f 0 + f 1 + ... + f n
-}
sumFun :: (Integer -> Integer) -> Integer -> Integer
sumFun f 0=f 0
sumFun f n=f n+sumFun f (n-1)

{-
5. 定义函数
maxFun :: (Integer -> Integer) -> Integer -> Integer
使得maxFun f n 等于f 0 , f 1 , ... , f n中的最大值。
-}
maxFun :: (Integer -> Integer) -> Integer -> Integer
maxFun f 0=f 0
maxFun f n=max (f n) (maxFun f n-1)

{-
6. 定义函数:
fib :: Integer ->Integer
使得fib n 返回第n个斐波那契数,如fib 0  =0, fib 1 = 1, fib 2 = 1, fib 3 = 2, fib 4 = 5 ,...。
-}
fib :: Integer ->Integer
fib n=if(n<2)then n else fib (n-1)+fib(n-2)

{-
7. 利用我们可以利用下列迭代公式求2的近似平方根:
 xn+1 = (xn + 2/xn)/2
方法是从任意一个初值x0开始,如x0 = 1, x1 = (x0 +2/x0)/2 =1.5, x2 = (x1 + 2/x1)/2= 1.41667, ...
请定义一个函数
sqrt2 :: Float ->Integer ->Float
使得sqrt2 x0 n  等于第n个逼近值xn, 例如,sqrt2 1.0 0 = 1.0, sqrt2 1.0 1 = 1.5, sqrt2 1.0 2 = 1.41667, ...。
-}
sqrt2 :: Float -> Integer -> Float
sqrt2 x0 0=x0
sqrt2 x0 n=(x + 2/x)/2 where x=sqrt2 x0 (n-1)

{-
8. 完成解求一元二次方程根的函数。
-}
roots::(Float,Float,Float)->(Float,Float)
roots (a,b,c)=((-b-sqrtDelta)/2/a,(-b+sqrtDelta)/2/a) where sqrtDelta=sqrt (b*b-4*a*c)