Powered by SmartDoc

関数の定義(その 2)

定義した関数の呼び出し

defunを用いて定義した、関数は、さらに、他の関数をdefunするときに、利用できます。

これによって、関数を少しずつ、複雑に、高機能にすることができます。

[演習1.8.1]
「演習1.7.9」を次のような形で実現する。
  1. まず、次の4つの関数を作りなさい。
    1. myadd :引数は二つで、足し算を行う。ただし、+と異なり、引数に数以外が指定されたら0ととする。
    2. mysub :引き算。後は、myaddに同じ
    3. mymul :掛け算。後は、myaddに同じ
    4. mydiv :割り算。後は、myaddに同じだが、0で割り算をしても、結果を0とする。
  2. 上記の4つを利用して、「演習1.7.9」と同じ機能のmcalc2を作れ。

再帰呼び出し

実は、lispでは、現在定義中の関数を、その定義の中で呼び出すことができる( listの定義を思い出そう.. )。ここでは例を示すので、これを参考にして、課題を解いて欲しい。

[演習1.8.2]
次の定義を打ち込み、何がおきるかを考えなさい。
  1. 階乗を計算する関数factの定義は次のようになる
    (defun fact (n) (if (plusp n) (* n (fact (- n 1))) 1 ))
    
  2. 次の計算をしてみなさい。
    (fact 6)
    
[演習1.8.3]
一つ前の演習を参考に、階和を計算する関数、sumを定義しなさい。"(sum 5)"の値は、5 + 4 + 3 + 2 + 1 = 15である。
[演習1.8.4]
二つの引数の最大公約数を計算するgcmを定義しなさい。"(gcm 12 18)"の値は、6である。