Реверс списка через foldr - Lisp
Формулировка задачи:
#!/usr/bin/racket #lang scheme (define (fold-right op init seq) (if (null? seq) init (op (car seq) (fold-right op init (cdr seq))))) (define (fold-left op init seq) (define (iter result rest) (if (null? rest) result (iter (op result (car rest)) (cdr rest)))) (iter init seq)) (define (reverse-r seq) (fold-right (lambda (x y) (append y (list x))) '() seq)) (display (reverse-r (list 1 2 3 4 5 6 7))) (newline)
Решение задачи: «Реверс списка через foldr»
textual
Листинг программы
scala> foldRight(List[Int]())(List(1, 2, 3), (x: Int, acc) => acc :+ x)) res0: List[Int] = List(3, 2, 1)
Объяснение кода листинга программы
В данном коде используется функция foldRight
для реверса списка.
Список, который нужно перевернуть, это List(1, 2, 3)
.
Функция foldRight
принимает три аргумента:
foldRight(List[Int]())
- это инициализация аккумулятора, который будет содержать результат. В данном случае аккумулятор инициализируется пустым спискомList[Int]()
.List(1, 2, 3)
- это список, который нужно перевернуть.(x: Int, acc) => acc :+ x)
- это функция, которая определяет, как будет происходить накопление результата. В данном случае функция просто добавляет текущий элементx
в конец аккумулятораacc
. Таким образом,foldRight
проходит по каждому элементу списка, начиная с последнего, и добавляет его в начало аккумулятора. В результате получается список, перевернутый относительно исходного. В данном случае результатом будетList(3, 2, 1)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д