Вы хотите две функции.Первая функция находит наименьший элемент x
.Вторая функция находит индекс элемента x
в списке.
Что-то вроде:
(define (find-least xs)
(foldl (lambda (e acc) (min e acc)) (car xs) xs))
(define (elem-index x xs)
(define (elem-index-find x xs ind)
(cond
((empty? xs) ind)
((eq? x (car xs))
ind)
(else (elem-index-find x (cdr xs) (+ ind 1)))))
(if (empty? xs)
(error "empty list")
(elem-index-find x xs 0)))
(define (index-of-least xs)
(let ((least (find-least xs)))
(elem-index least xs)))
Тест:
> (index-of-least (list 5 8 4 9 1 3 7 2))
4
Или за один проход:
(define (index-of-least-1-pass xs)
(define (index-do least ind-least ind xs)
(cond
((empty? xs) ind-least)
((< (car xs) least)
(index-do (car xs) (+ ind 1) (+ ind 1) (cdr xs)))
(else
(index-do least ind-least (+ ind 1) (cdr xs)))))
(index-do (car xs) 0 0 (cdr xs)))
Тест:
> (index-of-least-1-pass (list 5 8 4 9 1 3 7 2))
4
В index-do
вспомогательной функции сначала вы проверяете, пустой ли промежуточный список;это базовый случай, когда мы получаем только один элемент в списке и возвращаем его индекс.
Следующее условие проверяет, больше ли следующий элемент промежуточного списка, чем текущее значение least
, иесли это так, мы вызываем помощник с новым значением least
и его индексом.
Последнее условие выбирается, когда следующий элемент не больше least
, и оно вызывает вспомогательную функцию сте же значения least
и ind-least
и промежуточный список с удаленным элементом head, пока в списке нет элементов, и мы подошли к базовому случаю, когда в списке нет элементов.