- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
(define A (list 1 2 3 4 5))
(define (reverse L)
(let ((C (cdr L)))
(if (not (null? C))
(cons (reverse C) (car L))
(car L))))
(newline)
(display (reverse A))
(newline)
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−1
(define A (list 1 2 3 4 5))
(define (reverse L)
(let ((C (cdr L)))
(if (not (null? C))
(cons (reverse C) (car L))
(car L))))
(newline)
(display (reverse A))
(newline)
Почему у меня получается х****й лист после реверсинга? :-(
А он вот такой: ((((5 . 4) . 3) . 2) . 1)
(5 4 3 2 1) — это (5 . (4 . (3 . (2 . 1))))
Было (5 . (4 . (3 . 2)))
Нужно впихнуть единицу в конец. Значит, двойку нужно поменять на (2 . 1)
Эту задачу и решает append. Она оказалась сложнее, чем добавление в начало, ибо в начало можно добавить с помощью одного cons.
Можнл сделать и в конец O(1), если где-то отдельно хранить указатель на конец, но тогда его придётся обновлять при каждой вставке/удалении. Я пока не придумал, как это описать декларативно.
Я наврал. На самом деле (5 . (4 . (3 . (2 . (1 . nil)))))
Тогда для добавления в конец нужно менять nil на (cons новый-элемент nil)
(last (5 4 3 2)) вернёт (2) — то, что нужно.
А setcdr от этого списка (2) заменит nil на вставленный элемент.
Т. е. append реализовано как (setcdr (last список) (новый-элемент))
Черты характера Курта Кобейна?
Я уже всё решил... Угадайте-ка как!
Есть два стула:
1. Отделяем первый элемент через car и добавляем в конец (через append). Добавление в конец — затратная операция, ибо каждый раз нужно сканировать весь список в поиске конца.
2. Отделяем последний элемент через last и добавляем в начало (через cons). Поиск последнего элемента — затратная операция.
В обоих случаях получается маляр Шлёма.
В обычных императивных ЯП я бы постоянно держал в памяти указатель на конец списка, чтобы его каждый раз не искать.
да п***л на хуй, импертивный п***х
я не могу отказаться от веселья, у меня его и так нет
А тут не повезло. Брат увидел нас. Жена шла с любовником, они обнимались, целовались, а я шел сзади с сумками и пакетами. Брат ещё и на телефон это заснял. Родители вызвали меня "на разговор", потребовали объяснений. У меня не получилось ничего придумать, признался. Отец кричал, что я лох и терпила, позор семьи, мама и брат поддакивали. Сказали, чтобы наследство не ждал, все брату уйдет. И работаю я на фирме приятеля отца, лучше мне самому заявление написать.
Жена, когда узнала про разговор, тоже орала, что я тупой, раз никакой отмазки не придумал. Теперь она с любовником подумают, как меня наказать, чтобы я на всю жизнь запомнил.
ПМП.
что я глуп.
Я сидел в это время под кроватью и меня не было видно.
О! что я испытывал в этот момент!
Я хотел выскочить и крикнуть: «Нет, я не глуп!»
Воображаю, что бы тут было!
Я опять сидел под кроватью и не был виден.
Но зато мне-то было видно, что этот самый Михюся проделал с моей женой.
Сегодня моя жена опять принимала этого Михюсю.
Я начинаю думать, что я, в глазах жены, перехожу на задний план.
Михюся даже лазал в ящиках моего письменного стола.
Я сам сидел под кроватью и не был виден.
Я сидел опять под кроватью и не был виден.
Жена и Михюся говорили обо мне в самых неприятных выражениях.
Я не вытерпел и крикнул им, что они всё врут.
Я думаю, что она шлюха и сама дала на вписке по пьяне.
другие на говнокоде сидят
у нас разделение труда
Просто не нужно путать преступление "изнасилование" (достаточно серьезное преступление) с историями типа: "я приехала к нему с ночевкой, думая что мы просто друзья, а он стал меня за коленку трогать". Второе конечно тоже не очень, но на изнасилование не тянет
https://i.postimg.cc/nh5JWBLF/image.png
боже мой, как же заебало