Преобразовать многомерный список цифр так, чтобы шли сначала положительные, а затем отрицательные элементы - Lisp
Формулировка задачи:
Добрый день. Помогите пожалуйста сделать в Scheme: преобразовать многомерный список цифр таким образом чтобы шли сначала положительные, а затем отрицательные элементы.
Решение задачи: «Преобразовать многомерный список цифр так, чтобы шли сначала положительные, а затем отрицательные элементы»
textual
Листинг программы
;; racket-lang.org (define (zip l r) (cond ((null? l) r) ((null? r) l) (else (cons (first l) (cons (first r) (zip (rest l) (rest r))))))) (define (foo lst) (let-values (((r l) (partition negative? lst))) (zip l r))) (foo '(1 2 3 0 -3 -6 1 -5 -3)) ; '(1 -3 2 -6 3 -5 0 -3 1)
Объяснение кода листинга программы
В данном коде используется язык программирования Racket.
- Функция
zipпринимает два списка, и если один из них пустой, возвращает второй. Если оба списка пустые, возвращает пустой список. Если оба не пустые, то возвращает список, в котором первый элемент — первый элемент первого списка, второй элемент — первый элемент второго списка, и так далее. - Функция
fooпринимает списокlstи возвращает список, в котором сначала идут положительные элементы, а затем отрицательные. Для этого сначала списокlstделится на две части с помощьюpartition: первая часть — положительные числа, вторая — отрицательные. Затем функцияzipприменяется к этим двум спискам, чтобы объединить их в один список, в котором сначала идут положительные, а затем отрицательные элементы. - В конце кода вызывается функция
fooс аргументом(1 2 3 0 -3 -6 1 -5 -3). Результатом будет(1 -3 2 -6 3 -5 0 -3 1).