需要帮助的部分在我的Lisp程序中简化了分数

问题描述

当我完全不了解某些东西时,我通常会寻求帮助。

我的任务是制作一个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) = dgcd(a/d,b/d) = 1,因此只需要将分子和分母除以gcd一次即可。有关更多信息,请查看this

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...