玩具语言不使用*

时间:2017-05-10 13:46:04

标签: recursion lisp

这些天我正在制作像玩具语言一样的Lisp。 但是在没有*的情况下使用乘法功能的问题仍然存在。

像这样的DEFUN MULT(x y) add(add(x y) add(x y-1))

我尝试使用递归方法,但它进入无限循环 所以我决定只使用添加方法

1 个答案:

答案 0 :(得分:1)

根据定义,3 * 4可以是3 + 3 + 3 + 34 + 4 + 4。您的代码需要递归。为了防止无限递归,你必须有一个肯定会达到某种程度的基本情况。如果你与1相乘,那么结果将是另一个参数:

(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

这仅适用于正整数。在x为零或为负时将其保留为练习。

NB!您提供的代码看起来不像lisp。我的示例适用于任何Common Lisp实现!