Умножение двух унарных списков на основе функции сложения

(define unary-add
  (lambda (list1 list2)
    (if (pair? list1)
        (cons (car list1)
              (unary-add (cdr list1) list2))
        list2)))

Я выполнил сложение двух унарных представлений списков, как указано выше. Теперь я хочу их умножить, рассматривая умножение как многократное сложение. Итак, я использовал эту функцию и сделал следующее:

(define unary-mul
  (lambda (list1 list2)
    (if (pair? list1)
        (cons (car list1)
              (unary-mul (unary-add (cdr list1) list2)))
        list2)))

При запуске кода он говорит, что аргументы не совпадают. Где я ошибся?


person user5438439    schedule 12.10.2015    source источник


Ответы (1)


Ваш текущий подход не кажется правильным - рекурсивный вызов неуместен, а сообщение об ошибке указывает на то, что вы забыли передать второй параметр в unary-mul. Попробуйте это вместо этого:

(define unary-mul
  (lambda (list1 list2)
    (if (pair? list2)
        (unary-add list1
                   (unary-mul list1 (cdr list2)))
        '())))

Объяснение: умножение — это просто повторяющееся сложение, в приведенном выше коде мы продолжаем добавлять list1 и уменьшать длину list2, пока оно не станет пустым. Он работает так, как ожидалось:

(unary-mul '(x x x) '(x x))
=> '(x x x x x x)
person Óscar López    schedule 12.10.2015
comment
@ user5438439 Я рад это слышать, мне было очень приятно! - person Óscar López; 13.10.2015