gpt4 book ai didi

functional-programming - Racket 遍历列表并获取索引

转载 作者:行者123 更新时间:2023-12-03 16:11:59 25 4
gpt4 key购买 nike

我正在学习 Racket ,遇到了一些麻烦。

我想遍历一个列表并找到一些值的索引。我有以下代码:

(define (index list entry)
(define index 0)
(for ([i list])
#:break (equal? i entry)
(+ index 1))
index)

但是该函数始终返回0。有人可以指出我的错误吗?

我知道有一些功能,但是我想学习语法。

最佳答案

首先,获取列表中元素索引的最简单方法是index-of:

> (index-of '(1 3 5 2 4) 5)
2

我有时会做的另一种方法是使用 in-naturals序列。所以拿你的代码:
(define (index list entry)
(for/last ([i list]
[index (in-naturals)])
#:break (equal? i entry)
index))

之所以可行,是因为 for循环构造的迭代次数与最短序列的迭代次数一样多。 in-naturals将永远持续下去,因此它将仅计及 list中的元素个数,并且在满足 #:break子句时仍会中断。

第三种选择是再次根据您的代码使用 for/fold:
(define (index list entry)
(for/fold ([acc 0])
([i list])
#:break (equal? i entry)
(add1 acc)))

这是有效的,因为 acc充当累加器,并且每次迭代都会递增,直到满足 #:break子句为止。

最后,您的原始代码有两个主要问题。

首先, for表单始终返回 (void)。如果要返回最后一个元素,则需要使用 for/last

其次, +函数仅将两个数字相加。它不会将结果存储回变量中。因此,如果您真的想在此处使用变异,则需要执行以下操作:
(define (index list entry)
(define index 0)
(for ([i list])
#:break (equal? i entry)
(set! index (+ index 1)))
index)

但是,我再次强烈建议您仅使用 index-of,因为它已经在标准库中了。

关于functional-programming - Racket 遍历列表并获取索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60080454/

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