我正在尝试编写一个函数(positions N A L)
,它返回A出现在L中的每个索引的列表,N是给予L的第一个元素的数字。
例如,
(positions 0 'a '(a b c a d e a))
=> (0 3 6)
(positions 1 'a '(a b c a d e a))
=> (1 4 7)
到目前为止,我已经提出了这个问题(这是行不通的):
(define (positions N A L)
(cond
((null? L)
'())
((= (car L) A)
(cons N (positions (+ N 1) A (cdr L))))
(#t
(positions (+ N 1) A (cdr L)))))
答案 0 :(得分:4)
试试这个:
(define (positions N A L)
(cond
((null? L) '())
((equal? (car L) A) (cons N (positions (+ N 1) A (cdr L))))
(else (positions (+ N 1) A (cdr L)))))
问题在于=
仅针对数字定义。如果您确定该列表仅包含符号,请使用eq?
。否则使用equal?
,这是最常见的相等比较,适用于许多数据类型(数字,符号,布尔值等)。另外,使用else
作为最后一个条件,使用#t
是一个Common Lisp约定,不适用于Scheme。