函式程式設計實驗二:遞迴練習
阿新 • • 發佈:2018-12-15
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)