【发布时间】:2015-10-27 03:31:01
【问题描述】:
我写了一个函数,它给我一个语法错误,不知道为什么。您可以跳到底部阅读代码和错误,这里的其余内容只是更多可能不需要的信息。
我必须创建一个乘数函数,将两个数字列表相乘并将结果作为列表返回。
let bigMul l1 l2 =
let f a x = failwith "to be implemented" in
let base = failwith "to be implemented" in
let args = failwith "to be implemented" in
let (_, res) = List.fold_left f base args in
res
它通过假装将大整数表示为列表来相乘,因此 1234x24 是 [1;2;3;4] x[2;4] 它使用了我已经编写和测试过的几个函数。一种是 mulByDigit,它将列表中的每个 int 乘以一个 int 并返回一个列表,例如 [2;3;4;5] 1 将返回 [2;3;4;5]。它还使用 padZero ,它接受 2 个整数列表,并通过在较短的列表中添加零来使它们的长度相等,并返回一个包含两个列表的元组 ex [1;2;3] 和 [1] 将返回一个带有 ([1 ;2;3],[0;0;1])。最后一个函数 bigAdd 接受 2 个列表并将它们相加并返回结果,就像 [1;2;3] [1;2;3] 它会给出 [2;4;6]。所有这些功能都已经过测试并且可以正常工作,所以我不会为它们提供代码。
我编写了一个函数,它遵循获取列表 l1 的逻辑,将它乘以 l2 的每个数字,并根据数字与尾随零相乘,并保持总和。例如,如果列表 1 是 [1;2;3;4] 并且 l2 是 [2;4] 我取第二个列表并首先将其反转以获得 [4;2] 然后我将 1234 乘以 4 并得到结果。我将此结果添加到累加器中的当前值,该值一开始没什么,然后增加 i 以让我知道下一个有一个尾随零。然后我把剩下的 2 乘以 1234 并有一个尾随零,所以 24680。我将它添加到我的旧累加器中以获得最终值,并在 l2 中没有更多数字时返回该值。所以 1234+24680=25914。这是我写的函数。 a 是其中的累加器,i 用于跟踪我需要多少个零
let bigMul l1 l2 =
let f (i,a) x =
let sum = padZero ( (mulByDigit x l1)@(clone 0 i) ) a in
in let (first,second) = match sum with
| (y,z)->(y,z) in
( i+1, ( bigAdd first second ) ) in
let base = (0,[]) in
let args = List.rev ( l2 ) in
let (_, res) = List.fold_left f base args in
res
我在运行它时遇到一个语法错误,显示未绑定值 l2。不知道为什么这么想。
【问题讨论】:
-
什么是padZero、mulByDigit、克隆?
-
我已经写过的函数我不想在这里发布,因为那将在这里发布几乎整个家庭作业。不过我会给出他们的原型。
-
# 克隆 3 5;; - : 整数列表 = [3; 3; 3; 3; 3]
-
padZero [9;9] [1;0;0;2];; - : int list * int list = ([0;0;9;9],[1;0;0;2])
-
你真的应该得到 merlin,它可以帮助你更早地检查你的程序并发现错误。
标签: ocaml