『プログラミングHaskell』の練習問題を解く
スタートHaskell第1回の予習です。
『プログラミングHaskell』の練習問題を解いています。
2章の半ばまでの練習問題です。
1.7 練習問題
1. double (double 2) の結果を算出する他の計算方法を考えよ。
double (double 2) ={ 内側のdoubleを適用 } double (2 + 2) ={ doubleを適用 } (2+2)+(2+2) ={ 最初の+を適用 } 4+(2+2) ={ 次の+を適用 } 4+4 ={ +を適用 } 8
もしくは
double (double 2) = { 外側のdoubleを適用 } (double 2)+(double 2) = { 次のdoubleを適用 } (double 2)+(2 + 2) = { 次の+を適用 } (double 2)+4 = { double を適用 } (2+2)+4 = { 最初の+を適用 } 4+4 = { +を適用 } 8
2. x の値にかかわらず sum[x] = x であることを示せ。
sum[x] = { sumを適用 } x + sum[] = { sumを適用 } x + 0 = { +を適用 } x
3. 数値のリストに対し要素の積を計算する関数productを定義せよ。
puroduct[] = 1 puroduct(x:xs) = x * product xs
そして、その定義を使って product[2,3,4]=24 となることを示せ。
product[2,3,4] = { puroductを適用 } 2 * (product[3,4]) = { puroductを適用 } 2 * (3 * product[4]) = { puroductを適用 } 2 * (3 * (4 * product[])) = { puroductを適用 } 2 * (3 * (4 * 1)) = { *を適用 } 24
4. リストを逆順に整列するように関数qsortの定義を変えるにはどうすればよいか?
qsort[] = [] qsort(x:xs) = qsort larger ++ [x] ++ qsort smaller where smaller = [a|a<-xs,a<=x] larger = [b|b<-xs,b>x]
5. qsortの定義で、<=を<に置き換えるとどのような影響があるか?
ヒント:例として[2,2,3,1,1]を考えてみよ。
qsort[] = [] qsort(x:xs) = qsort smaller ++ [x] ++ qsort larger where smaller = [a|a<-xs,a<x] larger = [b|b<-xs,b>x] qsort[2,2,3,1,1] ={ qsortを適用 } qsort[1,1] ++ [2] ++ qsort[3] ={ qsortを適用 } (qsort[] ++ [1] ++ qsort[]) ++ [2] ++ (qsort[] ++ [3] ++ qsort[]) ={ qsortを適用 } ([] ++ [1] ++ []) ++ [2] ++ (qsort[] ++ [3] ++ qsort[]) ={ qsortを適用 } [1] ++ [2] ++ [3] ={ qsortを適用 } [1,2,3]