Я знаю, что вы можете написать простую факториальную функцию следующим образом:
(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
(список фактов)
'a
(список фактов 4)
24
(список фактов '(1 2 3))
минусы: второй аргумент должен быть списком, но получил 6 и 1
То, что я хочу, чтобы последний сделал, это return:
(список 1 2 6)
Я понятия не имею, почему это не сработает. Если бы кто-нибудь мог помочь мне разобраться в этом, не меняя всей структуры кода (т. е. не используя apply/map или несколько функций), я был бы очень признателен. Я бы предположил, что единственная перепутанная строка - это строка с минусами.
Спасибо.