我已经开始编写一个函数,该函数应该查找列表中元素的最后一次出现。我的想法是使用search
来计算指定符号的出现并将其返回。然后我会将计数传递给removeLast
,这将删除元素。然后,我会减少removeLast
的计数,以便于基本情况。从我看到使用set!
通常是不好的做法。有没有更好/更优雅的方式来“记住”符号的最后一次出现。查找并删除列表中指定元素的最后一次出现[racket]
(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
s为不能接受的,我必须考虑巢名单。
我明白你在说什么了。这很有帮助,非常感谢。 – BrianM