Функция продукта Lisp - PullRequest
       8

Функция продукта Lisp

0 голосов
/ 02 сентября 2018

Я только начинаю на Лиспе. Я пытаюсь сделать функцию продукта написанной на Лиспе. Функция должна принимать произвольный параметр x и возвращать произведение всех числовых значений, содержащихся в x. Должно выдать следующее:

>(product 'x) -> 1
>(product '(x 5)) -> 5
>(product '((2 2)3)) -> 12 
>(product '((a 3)(2 1))) -> 6

Мне удалось сделать следующее:

(defun product (x)
    "This function takes in an arbitrary parameter x, and returns the product of all numeric values contained within x."
    (cond
        ((consp x) (* (car x)(product (cadr x))))
        ((numberp x) x)
        (t 1)
    )
)

Это обрабатывает случаи как

(product '(2 5))-> 10
(product 'x) -> 1

Но не для таких, как:

>(product '(x 5)) -> 5
>(product '((2 2)3)) -> 12 

Я не уверен, куда идти отсюда.

1 Ответ

0 голосов
/ 02 сентября 2018

Первое предложение вашего выражения cond выглядит следующим образом:

Если x является cons-ячейкой, умножьте ее первый элемент (предполагается, что это число) на результат вызова product для второго элемента (или NIL).

И (product '(x 5)), и (product '((2 2) 3)) не работают, поскольку первый элемент не является числом. Вы должны умножить на (product (car x)) вместо (car x), чтобы преобразовать произвольные термины в числа.

Обратите внимание, что повторения на cadr недостаточно для итерации по всем элементам вашего входного списка. Вы, вероятно, намеревались использовать cdr.

...