2012-11-26 161 views
4

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

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

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

有人可以幫忙嗎?

+1

您是否嘗試過的東西?另外,你使用哪種語言? – looper

+0

方案,我有這: (定義地圖索引預解碼值 (拉姆達(預解碼值FL) (foldr相似(拉姆達(XY) (如果(預解碼值X) (利弊(FX)Y) (? (map-index-pred odd?sqr'(2 3 4 5))) (map-index-pred(lambda(i)( kelly

回答

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))) 
+0

您的索引方法不是尾遞歸。大列表可能會帶來問題。 –

8

財產以後這樣

(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)))))))) 
+0

非常感謝你!:) – kelly

+0

歡迎你,如果它解決了你的問題,請將其標記爲答案 – meirrav

5

以下是最明顯的解決方案,我能想出:

(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以便遞歸調用不會不必要地重複(以書面代碼或執行)。

接受的解決方案似乎沒有考慮空列表或列表中不包含正在尋找的元素。

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 
2

你可以使用反向成員長度CDR如下實施指數

(define (index a b) 
    (let [(tail (member a (reverse b)))] 
    (and tail (length (cdr tail)))) 
0

下面的代碼實現了目標:

(define (getpos element lst) 
    (let loop ([counter 0] [temp lst]) 
     (if (= element (car temp)) counter 
      (loop (+ counter 1) (cdr temp))))) 
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