Реверс списка через 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)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д