Obecnie robię Lisp jak Toy Languages. ale utknąłem w problemie z tworzeniem funkcji mnożenia bez *.
Jak na przykład DEFUN MULT(x y) add(add(x y) add(x y-1))
lubię to.
Próbowałem użyć metody rekurencyjnej, ale przechodzi ona w nieskończone pętle więc postanowiłem po prostu użyć metody add z nią
Odpowiedzi:
1 dla odpowiedzi № 1Z definicji 3 * 4
jest albo 3 + 3 + 3 + 3
lub 4 + 4 + 4
. Twój kod musi być rekurencyjny. Aby zapobiec nieskończonej rekurencji, musisz mieć skrzynkę podstawową, która z pewnością trafi na pewnym poziomie. Dobrym byłoby, jeśli się rozmnażasz 1
od tego czasu wynikiem byłby inny argument:
(defun mul (x y)
(if (= x 1)
y
(+ y (mul (1- x) y))))
(step (mul 3 4)) ; ==
(+ 4 (mul 2 4)) ; ==
(+ 4 (+ 4 (mul 1 4))) ; ==
(+ 4 (+ 4 4)) ; ==
(+ 4 8) ; ==
; ==> 12
Działa to tylko dla dodatnich liczb całkowitych. Aby działało, kiedy x
jest zerowy lub ujemny pozostawia się jako ćwiczenie.
NB! Podany kod nie wygląda na seplenienie. Mój przykład działa w dowolnej implementacji Common Lisp!