Как мне найти расположение элемента в списке? - PullRequest
1 голос
/ 28 мая 2011

Я новичок в схеме, и я хочу знать, как найти расположение элемента в списке.Например, в этом заданном списке

(list 1 2 13)

я нашел максимум с помощью накопительной рекурсии, но мне нужно также найти местоположение максимума, поэтому, если функция:

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

Пожалуйста, помогите мне.

Ответы [ 5 ]

3 голосов
/ 28 мая 2011

Это похоже на домашнюю работу, и если это так, то любое из этих решений не поможет. То, что вы, вероятно, ожидаете, это пересмотреть код, который вы написали, чтобы найти максимум: вместо одного входа аккумулятора в цикл, добавьте еще один для позиции максимума на данный момент. Это не будет слишком сложно, учитывая, что вы уже внедрили max.

1 голос
/ 25 июля 2013

Это должно сделать трюк: </p> <pre><code>(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)))

Тогда:

</p> <pre><code>(find-position (list 1 3 13) 13) >>> 2

1 голос
/ 29 мая 2011

сначала вы должны определить максимальное число:

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

наконец, перечислите оба результата.

(define (the_max_in_position lista)
  (list  (max_list1 lista) 
         (list (find_in_position (max_list1 lista) lista))))
1 голос
/ 28 мая 2011

Я не использую Схему, но в CL это (position 13 (list 1 2 13))

Может быть, это то же самое ...

Так что для вашего кода вы захотите что-то вроде этого:

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

, который возвращает (13 2)

edit: max должен быть вашим максимальным алгоритмом, хотя я думаю, что для этого

double edit уже может быть функция: если это все еще не работает, вы всегда можете использовать счетчик, который увеличивается каждый раз через вашу рекурсивную функцию, а затем вернуть это тоже ...

0 голосов
/ 28 мая 2011

Используйте list-ref следующим образом:

(define tlist '(a b c d))

(list-ref tlist 2)

>> c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...