我在 SML 中有两个列表,假设列表 A[(a,b,c),(d,e,f)]
和列表B[b,e]
。我想计算 B 中每个项目与 A 中每个三元组的第二个元素匹配的次数。输出应该是 2。因为b
and e
每个在 A 中出现一次。
到目前为止,这是我的代码,但是当我从 B 中的一个元素移动到另一个元素时,我的计数器始终设置为 0。我知道在 Java 中这只是一个简单的双 for 循环。
fun number_in_months (d : (int * int * int ) list, m : (int) list) =
if null m then 0
else if null d then number_in_months(d, tl m)
else if (#2(hd d)) = (hd m) then 1 + number_in_months (tl d, m)
else number_in_months(tl d, m)
该代码不会在递归调用之间累加值。还可能存在其他逻辑错误。
使用递归和函数累加值是一种常见模式,您可以阅读更多相关内容here。它的本质是使用解构列表head
and tail
直到列表为空并在每次调用时积累一些值。这sum
下面的函数是一个简单的例子来说明这一点。这可以适应你的例子来积累acc
when b
or e
被发现于list A
.
fun sum(numbers: (int) list) =
let fun sumR(numbers: (int) list, acc: int) =
if null numbers
then acc
else
sumR(tl numbers, hd numbers + acc)
in
sumR(numbers, 0)
end
运行于[1,2,3]
gives:
val sum = fn : int list -> int
- sum([1,2,3]);
val it = 6 : int
请注意,我故意对这个答案含糊其辞,因为这是一个有关 Coursera 编程语言课程作业的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)