/ / języki zabawkowe Mnożenie bez użycia * - rekursja, seplenienie

języki zabawek Mnożenie bez użycia * - rekurencja, seplenienie

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 № 1

Z 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!