【发布时间】:2023-11-06 21:28:01
【问题描述】:
我正在做这个家庭作业,我在这个问题上被困了大约 3 个小时。我刚刚给教授发了电子邮件,但还没有收到他们的回复,所以我决定也在这里问。
我们被分配编写各种函数,例如以 (14, 2) 格式查找分数的 gcd,其中 14 是分子,2 是分母。
我已经完成了 gcd、simplified、add 和 times 函数,但我卡在 addAll 上。
addAll 应该获取一个描述为坐标对的分数列表,并将它们全部加起来并简化它,然后将答案作为一个这样格式化的分数(分子,分母)返回。
目前,我的 addAll 函数将它们全部相加并返回格式正确的分数,但它并没有简化它。我已经编写了简化函数,但是每当我尝试围绕我的 addAll 递归调用调用简化时,我都会收到错误。
我当前的代码是这样的:
fun addAll L = if L = [] then [(0, 1)] else if tl L = nil then L else addAll(
[
( ((#1 (hd L)) * (#2 (hd (tl L)))) + (#1 (hd (tl L))) * (#2 (hd L)), (#2 (hd L))*(#2 (hd (tl L))) )
]
@
(tl (tl L))
);
(*
a = (#1 (hd L))
b = (#2 (hd L))
c = (#1 (hd (tl L)))
d = (#2 (hd (tl L)))
*)
我试图通过这样做来解决问题:
fun addAll L = if L = [] then [(0, 1)] else if tl L = nil then L else simplify(addAll(
[
( ((#1 (hd L)) * (#2 (hd (tl L)))) + (#1 (hd (tl L))) * (#2 (hd L)), (#2 (hd L))*(#2 (hd (tl L))) )
]
@
(tl (tl L))
));
(*
a = (#1 (hd L))
b = (#2 (hd L))
c = (#1 (hd (tl L)))
d = (#2 (hd (tl L)))
*)
但我遇到了错误。
任何帮助将不胜感激。
谢谢。
另外,如果有帮助,我会附上我在 sml 中运行的整个代码...
这是我所有的作业代码:
fun gcd (a, b) =
if b = 0 then a else gcd(b, a mod b);
fun simplify (a, b) = if gcd(a, b) < 2 then (a, b) else ((a div gcd(a, b)), (b div gcd(a, b)));
fun add (a,b) (c,d) = simplify((a*d + c*b), b*d);
fun times (a,b) (c,d) = simplify( (a*c), (b*d) );
fun addAll L = if L = [] then [(0, 1)] else if tl L = nil then L else addAll(
[
( ((#1 (hd L)) * (#2 (hd (tl L)))) + (#1 (hd (tl L))) * (#2 (hd L)), (#2 (hd L))*(#2 (hd (tl L))) )
]
@
(tl (tl L))
);
(*
a = (#1 (hd L))
b = (#2 (hd L))
c = (#1 (hd (tl L)))
d = (#2 (hd (tl L)))
*)
(*fun timesAll L = if L = [] then [(1, 1)] else if tl L = nil then L else timesAll();*)
fun lessThan (a, b) (c, d) = if ((real a) / (real b)) < ((real c) / (real d)) then true else false;
【问题讨论】:
-
请比“我遇到错误”更具体。如果您对模式匹配更加熟悉,您会帮自己一个大忙。
标签: sml