创建列表中列出的所有索引列表的函数

时间:2016-02-25 14:42:39

标签: functional-programming scheme lisp

我正在尝试编写一个函数(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)))))

1 个答案:

答案 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。