Определить номер в списки последнего положительного числа Scheme - Lisp
Формулировка задачи:
Решение задачи: «Определить номер в списки последнего положительного числа Scheme»
(defn f (l) (defn go (i l) (cond (null? l) 0 ((def r (go (+ 1 i) (cdr l))) (cond (> (car l) 0) (max i r) r)))) (go 0 l)) (printLn (f '(1 2 3 0 -6))) (printLn (f '(1 2 3 0 -6 8))) ........ 2 5
Объяснение кода листинга программы
В этом коде определена функция f, которая принимает список l в качестве аргумента. Внутри функции f определена вспомогательная функция go, которая принимает два аргумента i и l.
Если l равно nil, то go возвращает 0. Иначе, она рекурсивно вызывает go с аргументами i+1 и cdr l, и проверяет, больше ли значение первого элемента (car l) нуля. Если это так, то go возвращает максимальное значение из двух последних вызовов go. Если это не так, то go возвращает значение последнего вызова go.
Функция f вызывает go с аргументом 0 и списком l. Результат этого вызова сохраняется в переменной r. Затем функция f рекурсивно вызывает go с аргументами i+1 и cdr l. Если значение car l больше нуля, то go возвращает максимальное значение из r и нового вызова go. Если это не так, то go возвращает значение r.
Функция printLn вызывается дважды с аргументами (f '(1 2 3 0 -6)) и (f '(1 2 3 0 -6 8)). В результате, на экран выводятся числа 2 и 5.