最近授業で受けたテストであまり熱くしませんでした。しかし、他の誰もが同様にそれを爆撃したので、私たちの教授は、私たちがSchemeを知っていることを証明することによって、私たちにいくつかの「補う」ポイントを喜んで与えてくれます(それはあまり得意ではありません...)。しかし、彼女はテストの内容とは異なる質問をするでしょう。そのため、Scheme を使いこなすためにテストに出された問題に取り組んでいますが、次の問題がうまくいかないようです。
2 つのパラメータを取る Scheme 関数 reduce を書きます: f は単一のパラメータを取る関数で、x は任意の値です。reduce 関数は、x に含まれる入れ子になった各リストを使用して f を再帰的に呼び出し、元の入れ子になったリストを f の呼び出し結果に置き換えます。
たとえば、 (reduce (lambda(x) (cons 'list x)) '(3 7 9 zs (3 (78 2 3)))) を呼び出すと、次のように返されます。
'(リスト 3 7 9 zs (リスト 3 (リスト 78 2 3)))
また、 (reduce (lambda (x) (cdr x)) '(3 7 9 zs (3 (78 2 3)))) を呼び出すと、以下が返されます。
'(7 9 zs ((2 3))) で、ネストされた各リストから最初の要素が削除されます。
これは私が思いついたコードです:
(define reduce
(lambda (f x)
(if (null? x)'()
(let ((var (car x)))
(cond
((cons? var) (cons (f var) (reduce f (cdr x))))
((symbol? var) (cons var (reduce f (cdr x))))
((number? var) (cons var (reduce f (cdr x)))))))))
入力例を入力すると、次の結果が得られます。
(reduce (lambda(x) (cons 'list x)) '(3 7 9 zs (3 (78 2 3))))
(list 3 7 9 'z 's (list 'list 3 (list 78 2 3)))
誰がどこを知っているかから来ている余分な「リストがあります」
;
(reduce (lambda(x) (cdr x)) '(3 7 9 zs (3 (78 2 3))))
(list 3 7 9 'z 's (list (list 78 2 3)))
2 番目のネストされたループの 3 のみを削除します。最初の 3、中間の 3、3 番目の 78 を削除する必要があります。また、「リスト」という単語を含めるべきではありません
;
問題は ((cons? var) の行にあると想定していますが、修正方法がわかりません。
私たちは、Scheme 言語に深く入り込んでいないので、多くの特別なメソッドを学んでいません。それは主にすべて再帰です。
どんな助けでも大歓迎です。
ありがとう。