【问题标题】:Need help in part where fraction is simplified in my Lisp program在我的 Lisp 程序中简化分数的部分需要帮助
【发布时间】:2021-02-01 06:14:09
【问题描述】:

当我完全不明白某些事情时,我通常会寻求帮助。

我的任务是制作一个 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) 也是如此。有办法解决这个问题吗?

【问题讨论】:

  • 设置 nn 应该做些什么?它将n 设置为它的值?那会改变什么?
  • (return (values n d)) 返回两个值。

标签: loops recursion common-lisp fractions


【解决方案1】:

你可以试试下面的

(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 一次,因为如果gcd(a, b) = d,则gcd(a/d, b/d) = 1 的属性。欲了解更多信息,请查看this

【讨论】:

  • 这个答案很好,我只是有点不满意_gcd前面的下划线,你可以把它命名为gcd(?)
  • 我不想通过再次使用名称 gcd 来混淆这个问题(因为它也是一个内置函数)。如果你对它有强烈的感觉,我可以编辑它!谢谢
  • 我认为如果有人觉得它令人困惑,他们可能会提出后续问题;如果你想防止混淆,也许最好明确地告诉它(“这是一个函数,那里是一个变量,等等。Lisp-2,......”),而不是使用修改后的名称不是很地道。但我对此感觉并不强烈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多