プロが教える店舗&オフィスのセキュリティ対策術

Lisp

今リリカルLispをやっているのですが、
詰まってしまって答えがないので困っています。
問題は
(s n)を評価すると1+2+・・・+nが返るように関数をsiを定義する(ただしsは次のように定義されている define (s n) (si n 0) )
という問題です。
一応自分なりに考えたのが
(define si (lambda (n x) (if (= n 1) (x) (si (- n 1) (+ n x)))))
なんですが無限ループのようになるのかこれを実行すると固まって落ちてしまいます。

ご指摘よろしくお願いします。

A 回答 (3件)

(define (s n) (si n 0))



(define (si n x)
 (if (= n 0)
    x
   (si (- n 1) (+ n x))))
    • good
    • 0

ああ, どうでもいい話だけど, この形だと Scheme ではないかな. Lisp の「方言」といえば方言だけど, いろいろと違うところがあるので「似てるけど違う言語」と思った方がいいかもね.


そして, Lisp と Scheme の決定的な違いにより Lisp では (期待した動作をしないという点では同じだけど) 単に「関数 x が定義されていない」で終わるだけのはず. よほど腐った処理系でない限り「固まって落ちる」ということはない.
    • good
    • 0

(if (= n 1) (x) (si (- n 1) (+ n x)))


のところ, なんで (x) なの?

この回答への補足

回答ありがとうございます。確かにxじゃないですね。。
直してみて
(define si (lambda (n x) (if (= n 1) 1 (si (- n 1) (+ n x)))))
これでも間違いになるんですがもし分かればご指摘お願いします。]
ちなみに
(define si (lambda (n x) (if (= n 0) 0 (si (- n 1) (+ n x)))))
でも出来ませんでした。

補足日時:2010/09/10 23:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!