gpt4 book ai didi

recursion - 查找并删除列表中指定元素的最后一次出现 [racket]

转载 作者:行者123 更新时间:2023-12-02 05:01:53 25 4
gpt4 key购买 nike

我已经开始编写一个函数来查找列表中元素的最后一次出现。我的想法是使用 search 来计算指定符号的出现次数并将其返回。然后我会将计数传递给 removeLast 以删除该元素。然后我会减少 removeLast 中的计数以促进基本情况。据我所见,使用 set! 通常是不好的做法。有没有更好/更优雅的方法来“记住”最后一次出现的符号。

(define (lastLess lis symbol)
(define count 0)
(set! count (search symbol lis count))
(removeLast symbol lis count)
)

(define (search symbol lis count )
( cond ((null? lis) count)
( (eq? symbol (car lis)) (+ count (add1 (search symbol (cdr lis) count ))) )
( (pair? (car lis))(+ count(+ 0 (search symbol (car lis) count ))))
( else (+ count(+ 0 (search symbol (cdr lis) count))))
)
)

(define (removeLast symbol lis count)
(cond ((null? lis) '())
((eq? count 0) (cdr lis))
((eq? symbol (car lis)) ((set! count (sub1 count))
(cons (car lis)(removeLast symbol (cdr lis) count))
)
)
((pair? (car lis)) (removeLast symbol (car lis) count))
(else (cons (car lis) (removeLast symbol (cdr lis) count )))
)
)

按原样运行代码 ((set!count (sub1 count))(cons (car lis)(removeLast symbol (cdr lis) count)))) 抛出错误:

application: not a procedure; expected a procedure that can be applied to arguments given: # arguments...: '(e)

编辑:这是一个类作业,所以多余的 reverse 是 Not Acceptable ,我必须考虑嵌套列表。

最佳答案

您应该为此使用内置程序。特别要注意的是,remove 删除了 lisfirst 元素,它等于 symbol,因此删除了 < em>last 元素是反转列表的简单问题:

(define (lastLess lis symbol)
(reverse (remove symbol (reverse lis))))

(lastLess '(1 2 3 4 5 1) 1)
=> '(1 2 3 4 5)

上面的解决方案根本不需要使用 set!,正如您所怀疑的那样,不推荐使用 - 尽管可以通过改变列表来解决这个问题,但在 Scheme 中首选函数式解决方案.

当然,可以编写一个更有效的解决方案,一个只遍历列表一次的解决方案,但问问自己:您真的需要这样的解决方案增加复杂性吗?高性能有那么重要吗?如果答案是否定的,则坚持使用更简单、更清晰的解决方案。

关于recursion - 查找并删除列表中指定元素的最后一次出现 [racket],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16929765/

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