问题描述
当我完全不了解某些东西时,我通常会寻求帮助。
我的任务是制作一个Common Lisp程序,在该程序中将2个分数作为4个独立数字(n1 d1 n2 d2)输入,并在可能的情况下进行简化。
我的第一个功能是用这种方式为分子(n1 * d2)+(n2 * d1)和分母(d1 * d2)加分数。
第二个函数然后从第一个函数中获取分子和分母,然后从中计算gcf。在这种情况下,由于不知道如何实现,所以我从互联网上复制了代码。
我当前卡住的第三个函数将分子和分母传递给第二个函数和gcf,然后将分子和分母都划分为gcf,直到其中一个以gcf为模的模不再为零。
(defun simplify (n d dvs)
(loop
(setq n (/ n dvs)
d (/ d dvs))
(when (or (/= 0 (mod n dvs))
(/= 0 (mod d dvs)))
(setq n n d d)))
(finalprint n d))
由于(return)
不能返回大于1的值,因此我尝试了(values n d)
,但是该程序只是不做任何事情而被卡住了,(setq n n d d)
也是如此。有解决这个问题的主意吗?
解决方法
您可以尝试以下
(defun simplify (n d _gcd)
(cons (/ n _gcd) (/ d _gcd)))
(defun add (n1 d1 n2 d2)
(let ((numerator (+ (* n1 d2) (* n2 d1)))
(denominator (* d1 d2)))
(simplify numerator denominator (gcd numerator denominator))))
(write (add 10 20 10 20)) ;;; (1 . 1)
(write (add 1 2 1 4)) ;;; (3 . 4)
(write (add 3 4 3 4)) ;;; (3 . 2)
gcd
是LISP中的内置函数,因此您不必对此太担心。 let
允许您命名LISP表达式,然后在后续表达式中使用它们。有关更多信息,请咨询this。
最后,由于属性gcd(a,b) = d
为gcd(a/d,b/d) = 1
,因此只需要将分子和分母除以gcd一次即可。有关更多信息,请查看this。