Реверс списка через 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).