5

我需要在方案列表中获取元素的索引。例如:

(... 2 '(2 3 4 5))

0

(... 4 '(2 3 4 5))

2

有人可以帮忙吗?

4

7 回答 7

9

像这样的东西

(define list-index
        (lambda (e lst)
                (if (null? lst)
                        -1
                        (if (eq? (car lst) e)
                                0
                                (if (= (list-index e (cdr lst)) -1) 
                                        -1
                                        (+ 1 (list-index e (cdr lst))))))))
于 2012-11-26T10:36:43.333 回答
6

以下是我能想到的最清晰的解决方案:

(define (get-list-index l el)
    (if (null? l)
        -1
        (if (= (car l) el)
            0
            (let ((result (get-list-index (cdr l) el)))
                (if (= result -1)
                    -1
                    (1+ result))))))

这个解决方案与 merriav 的解决方案基本相同,只是我在末尾添加了一个 let 以便递归调用不会不必要地重复(在书面代码或执行中)。

公认的解决方案似乎没有考虑空列表或不包含所寻求元素的列表。

于 2013-12-16T02:39:12.160 回答
3

您可以使用reversememberlengthcdr实现索引,如下所示:

(define (index a b)
  (let [(tail (member a (reverse b)))]
    (and tail (length (cdr tail))))
于 2014-06-30T16:21:04.817 回答
0

我的最终解决方案:

(define index
  (lambda (cislo l)
    (if (equal? (car l) cislo) 0 (+ 1 (index cislo (cdr l))))))
(define map-index-pred
  (lambda (pred? f l)
     (foldr (lambda (x y)
       (if (pred? (index x l))
         (cons (f x) y) (cons x y))) '() l)))
于 2013-03-01T11:18:49.780 回答
0

答案比你们预期的要容易,也没有递归:)

简单的功能,以防您确定元素在列表中

(define element-index
  (lambda (elemento lista)
    (- (length lista) (length (memv elemento lista)))))

如果您考虑元素可能不在列表中的情况。false没找到就返回

(define element-index
  (lambda (elemento lista)
    (if (eqv? (list? (memv elemento lista)) #t)
        (- (length lista) (length (memv elemento lista)))
        false
        )
    ))

最后结果:

> (element-index 2 '(2 3 4 5))
0
> (element-index 4 '(2 3 4 5))
2
> (element-index 6 '(2 3 4 5))
false
于 2014-06-30T09:02:28.153 回答
0

如果你不需要担心元素不在列表中的情况,下面的代码可能是最短的版本。(如果元素不在列表中,则会发生异常。)

(define (element-index e lst)
    (cond [(eqv? e (car lst)) 0]
          [else (+ (element-index e (cdr lst)) 1)])))

否则,请使用以下代码:

(define element-index
  (letrec
    ([element-index-helper
       (lambda (e lst index)
         (cond [(null? lst) #f]
               [(eqv? e (car lst)) index]
               [else (element-index-helper e (cdr lst) (+ index 1))]))])
    (lambda (e lst)
      (element-index-helper e lst 0))))

例子:

> (element-index 'a '(a b c))
0
> (element-index 'b '(a b c))
1
> (element-index 'c '(a b c))
2
> (element-index 'd '(a b c))
#f
于 2016-04-10T14:53:46.663 回答
0

以下代码实现了目标:

(define (getpos element lst)
    (let loop ([counter 0] [temp lst])
        (if (= element (car temp)) counter
            (loop (+ counter 1) (cdr temp)))))
于 2016-02-27T17:02:58.737 回答