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

Loops 在我的Lisp程序中分数简化部分需要帮助吗,loops,recursion,common-lisp,fractions,Loops,Recursion,Common Lisp,Fractions,当我完全不明白的时候,我通常会寻求帮助 我的任务是制作一个通用的Lisp程序,其中添加2个分数作为4个独立的数字输入(n1 d1 n2 d2),并尽可能简化它 我的第一个函数就是以这种方式为分子(n1*d2)+(n2*d1)加分数,为分母(d1*d2)加分数 然后,第二个函数从第一个函数中获取分子和分母,然后从中计算gcf。在本例中,我从internet复制了一个代码,因为我不知道如何实现它 我现在遇到的第三个函数,取通过第二个函数的分子和分母,然后将分子和分母除以gcf,直到它们中的任意一个模

当我完全不明白的时候,我通常会寻求帮助

我的任务是制作一个通用的Lisp程序,其中添加2个分数作为4个独立的数字输入(n1 d1 n2 d2),并尽可能简化它

我的第一个函数就是以这种方式为分子(n1*d2)+(n2*d1)加分数,为分母(d1*d2)加分数

然后,第二个函数从第一个函数中获取分子和分母,然后从中计算gcf。在本例中,我从internet复制了一个代码,因为我不知道如何实现它

我现在遇到的第三个函数,取通过第二个函数的分子和分母,然后将分子和分母除以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 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表达式,然后在后续表达式中使用它们。有关更多信息,请咨询


最后,只需将分子和分母除以gcd一次,因为如果
gcd(a,b)=d
,则
gcd(a/d,b/d)=1
。有关更多信息,请参阅签出。

n
设置为
n
应该有什么作用?它将
n
设置为其值?这会有什么变化?
(return(values n d))
返回两个值。这是一个很好的答案,我只是对_gcd前面的下划线有点不满意,您可以将其命名为gcd(?)我不想再次使用名称gcd来混淆这个问题(因为它也是一个内置函数)。如果你对它有强烈的感觉,我可以编辑它!谢谢,我认为如果有人觉得困惑,他们可能会问后续问题;如果您想避免混淆,最好明确地告诉它(“这是一个函数,这是一个变量,等等,Lisp-2,…”),而不是使用一个不太惯用的修改名称。但我对此没有强烈的感觉。