Умножить без + или * - PullRequest
       22

Умножить без + или *

5 голосов
/ 25 ноября 2011

Я прорабатываю Как разрабатывать программы самостоятельно. Я не совсем понял сложную линейную рекурсию, поэтому мне нужна небольшая помощь.

Проблема: Определите multiply, который использует два натуральных числа, n и x, и производит n * x без использования схемы *. Исключите + из этого определения.

Прямо со знаком +:

(define (multiply n m)
  (cond
    [(zero? m) 0]
    [else (+ n (multiply n (sub1 m)))]))

(= (multiply 3 3) 9)

Я знаю, чтобы использовать add1, но я не могу сделать это правильно, рекурсия.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 26 ноября 2011

Разделите задачу на две функции. Во-первых, вам нужна функция (add m n), которая добавляет m к n. Каков базовый случай? когда n равно нулю, вернуть m. Что такое рекурсивный шаг? добавьте единицу к результату повторного вызова add, но уменьшив n. Как вы уже догадались, add1 и sub1 будут полезны.

Другая функция, (mul m n), аналогична. Каков базовый случай? если m или n равны нулю, вернуть 0. Что такое рекурсивный шаг? добавьте (используя ранее определенную функцию) m к результату повторного вызова mul, но уменьшив n. И это все!

5 голосов
/ 25 ноября 2011

Поскольку это почти наверняка вопрос типа домашнего задания, только подсказки.

Как добавить 7 и 2?В то время как большинство людей просто придумывают 9, есть ли более простой способ?

Как насчет увеличения первого числа и уменьшения второго до тех пор, пока один из них не достигнет нуля?

Затем другойодин ответДавайте попробуем пример:

7 2
8 1
9 0 <- bingo

Это будет хорошо работать для натуральных чисел, хотя вы должны быть осторожны, если хотите применить его к негативам.Вы можете попасть в ситуацию (например, с 10 и -2), когда оба числа отходят от нуля.Конечно, вы могли бы проверить это заранее и поменять местами операции.

Итак, теперь вы знаете, что можете написать + в терминах инструкции увеличения и уменьшения.Это не фантастика для рекурсии, но, так как ваше умножение на рекурсивное добавление уже испытывает ту же проблему, это, вероятно, приемлемо.

Теперь вам просто нужно узнать, как увеличивать и уменьшать LISP без использования +.Интересно, могут ли быть какие-то конкретные инструкции для этого: -)

...