1. 程式人生 > >函式程式設計實驗二:遞迴練習

函式程式設計實驗二:遞迴練習

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)