スキームのリストにある要素のインデックスを取得する必要があります。例えば:
(... 2'(2 3 4 5))
0
(... 4'(2 3 4 5))
2
誰かが助けることができますか?
このようなもの
(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))))))))
以下は私が思いつくことができる最も明確な解決策です:
(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))))))
このソリューションは、再帰呼び出しが(記述されたコードまたは実行で)不必要に繰り返されないように最後にletを追加したことを除いて、merriavのソリューションとほぼ同じです。
受け入れられた解決策は、空のリスト、または求められている要素を含まないリストを説明していないようです。
次のように、 reverse、member、length、およびcdrを使用してインデックスを実装できます。
(define (index a b)
(let [(tail (member a (reverse b)))]
(and tail (length (cdr tail))))
私の最終的な解決策:
(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)))
答えは皆さんが予想したよりも簡単で、再帰もありませんでした:)
要素がリストにあることが確実な場合の単純な関数
(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
次のコードは目的を達成します:
(define (getpos element lst)
(let loop ([counter 0] [temp lst])
(if (= element (car temp)) counter
(loop (+ counter 1) (cdr temp)))))
要素がリストにない場合を心配する必要がない場合は、次のコードがおそらく最短バージョンです。(要素がリストにない場合は例外が発生します。)
(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