gpt4 book ai didi

list - 列表的 WHILE 循环

转载 作者:行者123 更新时间:2023-12-01 06:07:00 33 4
gpt4 key购买 nike

我需要用 SML 编写一个非常简单的函数。它应该检查值“elem”是否大于列表“L”中字段“f1”的任何值。列表“L”包含 3 个字段 -“f1”、“f2”、“f3”。如果语句“elem>f1”对于列表“L”的任何成员为真,该函数应返回 1。否则,该函数应返回 0。例如:

L = 
f1 f2 f3
1 4 6
2 1 2
3 4 8
8 5 9

elem = 3

fun check(L: myList, elem: int): int =
let
val counter = ref 0
val counter_end = length L
in
while (!counter <= counter_end) do
let val f1 = List.nth(L,counter)
in
if elem > f1 then 1 else 0
end
counter := !counter + 1
end

我不知道如何从列表“L”中获取字段“f1”。非常感谢任何想法。

最佳答案

在 SML(以及一般的函数式语言)中,您通常希望依赖递归而不是循环等命令式结构。

我对 SML 有点生疏,但这是定义函数的一种方法

fun check elem [] = 0
| check elem ((f1,f2,f3)::tl) = if elem > f1 then 1 else check elem tl;

然后可以这样调用:

(* define a list to scan *)
val L = [(1,4,6),(2,1,2),(3,4,8),(8,5,9)];
(* call the function on our list *)
check 3 L;

该函数是使用模式匹配递归定义的:第一行表示如果在空列表上调用该函数,则结果为零。第二行表示如果它在列表上调用,其中第一个元素是元组 (f1,f2,f3),则如果 elem > f1,则结果为 1 >,否则就是在链表尾部递归调用函数的结果

另请注意,我省略了类型说明符。您很少需要它们,因为语言会自动推断类型。编译器已经知道哪些类型可以安全地与您编写的代码一起使用,那么为什么还要费心告诉它您认为参数将是什么类型呢?

关于list - 列表的 WHILE 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554983/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com