如何在列表中找到元素的位置?

时间:2011-05-28 17:43:53

标签: scheme

我是计划的初学者,我想知道如何在列表中找到元素的位置。例如,在此给定列表中,

(list 1 2 13)

我发现使用累积递归的最大值,但我还需要找到最大值的位置,所以如果函数是:

(max-with-location (list 1 2 13)), I need to get: (list 13 (list 3))

请帮帮我。

5 个答案:

答案 0 :(得分:3)

这听起来像是家庭作业,如果是这种情况,那么任何这些解决方案都无济于事。您可能期望做的是修改您编写的代码以找到最大值:而不是单个累加器输入到循环,再添加一个用于最大值的位置。鉴于您已经实施了max

,这不会太难

答案 1 :(得分:1)

我不使用Scheme,但在CL中它是(position 13 (list 1 2 13))

也许它是一样的......

所以对于你的代码,你需要这样的东西:

(list (max (list 1 2 13)) (position (max (list 1 2 13)))

将返回(13 2)

编辑:max应该是你的最大算法,虽然我想可能已经有了这个

的函数

double edit:如果仍然不起作用,你总是可以使用一个计数器,每次递增递归函数,然后返回...

答案 2 :(得分:1)

首先你必须确定最大数量:

(define max_list1
    (lambda (l)
      (cond
        ((empty? (rest l)) l)
        (else (max_aux_list (first l) (rest l))))))

(define (max_aux_list n lista)
  (cond
    ((empty? lista) n)
    ((> n (first lista)) (max_aux_list n (rest lista)))
    (else (max_aux_list (first lista) (rest lista)))))

然后你必须计算一个元素的位置编号。

(define find_in_position
  (lambda (n lista)
    (cond
      ((empty? lista) 0)
      ((= n (first lista)) 1)
      (else (+ 1 (find_in_position n (rest lista)))))))

最后,列出两个结果。

答案 3 :(得分:1)

这应该可以解决问题:

(define (find-position list element #!optional (pred eq?))
  (letrec ((loop (lambda (list count)
           (if (null? list) #f ;No such element found
               (if (pred (car list) element) count
            (loop (cdr list) (+ count 1)))))))
    (loop list 0)))

(define (find-position list element #!optional (pred eq?)) (letrec ((loop (lambda (list count) (if (null? list) #f ;No such element found (if (pred (car list) element) count (loop (cdr list) (+ count 1))))))) (loop list 0)))

然后:

(find-position (list 1 3 13) 13)
>>> 2

答案 4 :(得分:0)

像这样使用list-ref:

(define tlist '(a b c d))

(list-ref tlist 2)

>> c