Я новичок, когда дело доходит до программирования в lisp и плохой честной рекурсии, не является моей сильной стороной, мне было поручено написать функцию, которая упростила бы арифметические уравнения, но не решила бы их. Вот рекомендации, кстати, это школьный проект.Lisp Арифметическое упрощение
* Запись функции упрощения, что принимает любое арифметическое выражение, как описано выше (а не только примеры показаны), и возвращает новую функцию, в которой сделаны следующие улучшения, если они возможны:
Умножение суб -выражение a. С аргументом 0 в качестве аргумента подвыражение заменяется на 0:
(* 3 5 0) -> 0
b. С 1 в качестве аргумента 1 удаляется:(* 1 2 6) -> (* 2 6)
. Если остается только один аргумент, то подвыражение заменяется на этот аргумент:(* 1 6) -> 6
Подвыражение дополнительного a. Любое возникновение 0 исключается:
(+ 0 2 7 7) -> (+ 2 7 7)
. Если только один аргумент остается, то Подвыражение устраняется:(+ 0 7) -> 7
Мои одногруппники, и я написал это до сих пор:
(defun simplify (lis)
(cond
((null lis) '())
((eq (car lis) '*)
(cond
((not(null (member '0 lis))) 0)
((not(null (member '1 lis))) (simplify (remove '1 lis)))
(t (simplify (cdr lis)))
)
)
((eq (car lis) '+)
(cond
(t 0)
)
)
((listp (car lis)) (cons (simplify (car lis))(simplify (cdr lis))))
(t (cons (simplify (car lis)) (simplify (cdr lis))))
)
)
Мы не можем заставить его работать правильно, если у вас есть предложения! Вы также можете игнорировать нашу + функцию, которая еще не закончена.
В ваших случаях 't' вам нужно перебрать все аргументы, заменив их результатом вызова' simplify' на них. «mapcar» будет полезен здесь. – Barmar
Не могли бы вы немного объяснить, что вы имеете в виду, перейдя по всем аргументам – burt
Если у вас есть '(* (+ 3 0) (* 1 10))', вам нужно вызвать 'simplify' on' (+ 3 0) 'и' (* 1 10) ', так что вы получите' (* 3 10) '. – Barmar