如何从列表SML返回项目索引?

时间:2013-10-14 05:42:32

标签: list sml

我在SML中遇到了一个问题。此函数应返回不会求和的数字列表索引,但将其作为总和。 调用函数:index(10,[1,2,3,4,5,6,7]) 结果应为3 (10是数字的总和,我们从列表中寻找一个给出10的索引,例如: 1 + 2 + 3 = 6,1 + 2 + 3 + 4 = 10,并返回previuos one)

fun index (sum : int, numbers : int list) =
    if null numbers
    then 0
    else if hd(numbers) > sum
    then 0
    else 1 + index(sum, (hd(numbers)+(hd(tl numbers)))::(tl numbers))

似乎有效,但结果是错误的。 函数每两次调用增加结果,即使它不应该。 有谁能告诉我如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

你需要保留一个计数器和总计。计数器随着每次递归调用递增,总计等于每个hd(数字)的总和,然后在总数> gt时返回计数器。总和。

像这样;

if (total + hd numbers) >= sum
then counter
else recursivecall(total + hd numbers, tl numbers, counter + 1)

答案 1 :(得分:2)

你快到了。虽然我同意@koodawg的观点,即添加计数器和运行总计是解决此问题的另一种解决方案,但在代码中使用这些解决方案会使其复杂化程度超过预期。

首先,我对您的代码有一些评论。你必须删除不必要的parens。 hd(numbers)hd numbers相同,(hd(tl numbers))等于hd(tl numbers)。因此,(hd(numbers)+(hd(tl numbers)))可以简化为(hd numbers + hd(tl numbers))。此外,您可以将if null numbersif hd(numbers) > sum组合在一个条件中以简化代码,因为它们会产生相同的结果:0

我将尝试解释代码的工作原理,并希望您能够了解修改代码的位置。

使用您的示例index(10, [1,2,3,4,5,6,7])您的代码执行将如下所示:

1)

 fun index(10, [1,2,3,4,5,6,7]) =
     if 1 > 10 
     then 0 
     else 1 + (10, [1 + 2] append to [2,3,4,5,6,7]) 

新列表: [3,2,3,4,5,6,7]
结果: 1

2)

 fun index(10, [3,2,3,4,5,6,7]) =
     if 3 > 10 
     then 0 
     else 1 + (10, [3 + 2] append to [2,3,4,5,6,7]) 

新列表: [5,2,3,4,5,6,7]
结果: 1

3)

 fun index(10, [5,2,3,4,5,6,7]) =
     if 5 > 10 
     then 0 
     else 1 + (10, [5 + 2] append to [2,3,4,5,6,7]) 

新列表: [7,2,3,4,5,6,7]
结果: 1

4)

 fun index(10, [7,2,3,4,5,6,7]) =
     if 7 > 10 
     then 0 
     else 1 + (10, [7 + 2] append to [2,3,4,5,6,7]) 

新列表: [9,2,3,4,5,6,7]
结果: 1

5)

 fun index(10, [9,2,3,4,5,6,7]) =
     if 9 > 10 
     then 0 
     else 1 + (10, [9 + 2] append to [2,3,4,5,6,7]) 

新列表: [11,2,3,4,5,6,7]
结果: 1

6)

 fun index(10, [11,2,3,4,5,6,7]) =
     if 11 > 10 
     then 0 

结果: 0

总结所有结果:1 + 1 + 1 + 1 + 1 + 0 = 5(就像你说的那样,你的函数为预期结果加2)

正确的代码必须符合以下条件:

1)

 fun index(10, [1,2,3,4,5,6,7]) =
     if 1 > 10 
     then 0 
     else 1 + (10, [1 + 2] append to [3,4,5,6,7]) 

新列表: [3,3,4,5,6,7]
结果: 1

2)

 fun index(10, [3,3,4,5,6,7]) =
     if 3 > 10 
     then 0 
     else 1 + (10, [3 + 3] append to [4,5,6,7]) 

新列表: [6,4,5,6,7]
结果: 1

3)

 fun index(10, [6,4,5,6,7]) =
     if 6 > 10 
     then 0 
     else 1 + (10, [6 + 4] append to [5,6,7]) 

新列表: [10,5,6,7]
结果: 1

4)

 fun index(10, [10,5,6,7]) =
     if 10 > 10 
     then 0

结果: 0

总结所有结果:1 + 1 + 1 + 0 = 3这是预期的答案。

提示:您始终确保您的功能正在处理的新列表必须小于上一个列表/原始列表。

我希望我能清楚地解释为什么你的代码无效。我没有包含代码,因为我知道这是在线课程的作业。