问题:编写一个函数number_before_reaching_sum,它接受一个名为sum的整数,您可以假设它是正的,而一个int列表包含所有的正数,并返回一个int。您应该返回一个int n,以便列表的前n个元素加到小于sum,而列表的第一个n+1元素添加到sum或更多。假设整个列表的总和大于传递的值;如果不是这样的话,异常就会发生。
我从SML上辞职了,也找不出这个简单的例子有什么问题。错误信息请帮助我调试下面的代码
fun number_before_reaching_sum (sum:int, xl: int list) =
if hd xl = sum
then 0
else
(hd xl) + number_before_reaching_sum(sum, (tl xl))
发布于 2022-04-08 12:32:14
在简短的列表中尝试解决方案的几个步骤:
number_before_reaching_sum (6, [2,3,4])
--> if 2 = 6
then 0
else 2 + number_before_reaching_sum(6, [3,4])
--> 2 + if 3 = 6
then 0
else 3 + number_before_reaching_sum(6, [4])
--> ...
你很清楚地看到这是错误的--列表中的元素不应该加起来,你不能一直在每个尾巴上寻找相同的和。
您应该返回一个int,以便列表的前n个元素加到小于sum,但是列表的前n+1元素添加到sum或更多。
这意味着,如果头部大于或等于之和,则结果为0,
if hd xl >= sum
then 0
否则,索引比尾部的索引多一个,而不是hd xl
。
另外,您要寻找的“尾和”不是原始和,而是没有hd xl
的和。
else 1 + number_before_reaching_sum(sum - hd xl, tl xl)
https://stackoverflow.com/questions/71523045
复制相似问题