我已经开始编写一个函数来查找列表中元素的最后一次出现。我的想法是用来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))))
引发错误:
申请:不是程序;期望一个可以应用于给定参数的过程:# arguments...: '(e)
编辑:这是一个类的分配,所以多余reverse
的 s 是不可接受的,我必须考虑嵌套列表。