1

これを行うことで簡単な階乗関数を書くことができることを私は知っています:

(define fact
  (lambda (n)
    (if (= n 0) 1
        (* n (fact (- n 1)))))

ただし、これは番号を送信した場合にのみ機能します。リストまたはシンボルを送信するとエラーになります。だから私がやりたいのは、それがすべてで機能するようにすることです。リストの場合は、リスト内の個々の要素の階乗を行います。ここに私が持っているものがあります:

(define listFact
 (lambda (n)
   (cond
     ((null? n) 1)
     ((symbol? n) n)
     ((number? n) (if (= n 0) 1 (* n (listFact (- n 1)))))
     ((cons? n) (cons (listFact(car n)) (listFact(cdr n)))))))

私はSchemeがあまり得意ではありませんが、基本を知る必要があります。リストを除いて、すべての入力は適切に機能します。

> (listFact '())

1

(listFact 'a)

'a

(listFact 4)

24

(listFact '(1 2 3))

短所: 2 番目の引数はリストでなければなりませんが、6 と 1 を受け取りました

最後にやりたいことは、次のように返すことです。

(リスト 1 2 6)

うまくいかない理由がわかりません。コードの構造全体を変更せずに (つまり、apply/map または複数の関数を使用しないでください)、誰かがこれを理解するのを手伝ってくれたら、大歓迎です。めちゃくちゃな行は、短所のある行だけだと思います。

ありがとう。

4

2 に答える 2