Хламидомонада / Говнокод #28596 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 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)

Почему у меня получается х****й лист после реверсинга? :-(

Запостил: JloJle4Ka JloJle4Ka, (Updated )

Комментарии (42) RSS

  • Я хочу вот такой: (5 4 3 2 1)
    А он вот такой: ((((5 . 4) . 3) . 2) . 1)
    Ответить
      • Т. е. чтобы добавлять элемент в конец списка, а не в начало, нужно последний элемент менять на пару.
        Было (5 . (4 . (3 . 2)))
        Нужно впихнуть единицу в конец. Значит, двойку нужно поменять на (2 . 1)

        Эту задачу и решает append. Она оказалась сложнее, чем добавление в начало, ибо в начало можно добавить с помощью одного cons.
        Ответить
        • И тут возникает вопрос скорости. Я правильно полагаю, что добавить элемент в начало списка будет быстрее, чем в конец?
          Ответить
          • Это связанный список, у него сложность добавления элементов О(1) (или О(n), смотря как посмотреть)
            Ответить
            • Да, в начало — O(1), в конец — O(n).

              Можнл сделать и в конец O(1), если где-то отдельно хранить указатель на конец, но тогда его придётся обновлять при каждой вставке/удалении. Я пока не придумал, как это описать декларативно.
              Ответить
      • > (5 . (4 . (3 . (2 . 1))))

        Я наврал. На самом деле (5 . (4 . (3 . (2 . (1 . nil)))))

        Тогда для добавления в конец нужно менять nil на (cons новый-элемент nil)
        Ответить
        • Прочитать невидимый элемент nil можно, передав в функцию nthcdr длину списка. А вот функция setnthcdr, с помощью которой его можно было бы заменить, относится к расширениям и может не входить в стандартную библиотеку.
          Ответить
          • Хотя стоп! Есть же last.

            (last (5 4 3 2)) вернёт (2) — то, что нужно.
            А setcdr от этого списка (2) заменит nil на вставленный элемент.

            Т. е. append реализовано как (setcdr (last список) (новый-элемент))
            Ответить
    • Нука, давай без гугла..
      Черты характера Курта Кобейна?
      Ответить
  • Ну что, никто не знает?

    Я уже всё решил... Угадайте-ка как!
    Ответить
  • В Лиспе можно реализовать разворот списка не алгоритмом маляра Шлёмы?

    Есть два стула:
    1. Отделяем первый элемент через car и добавляем в конец (через append). Добавление в конец — затратная операция, ибо каждый раз нужно сканировать весь список в поиске конца.
    2. Отделяем последний элемент через last и добавляем в начало (через cons). Поиск последнего элемента — затратная операция.

    В обоих случаях получается маляр Шлёма.

    В обычных императивных ЯП я бы постоянно держал в памяти указатель на конец списка, чтобы его каждый раз не искать.
    Ответить
    • Там нельзя итерировать один список и добавлять каждый элемент в начало другого? И обязательно должно быть in-place?
      Ответить
      • > итерировать
        да п***л на хуй, импертивный п***х
        Ответить
      • В этом коде не совсем in-place. Ну то есть числовые значения остаются на месте, а вот связи к ним строятся новые без разрушения старого списка.
        Ответить
  • У нас с женой куколд отношения. Когда начали встречаться, она сказала, что иной формат для нее неприемлем. Я очень влюблен был, пересилил себя, а потом привык.
    А тут не повезло. Брат увидел нас. Жена шла с любовником, они обнимались, целовались, а я шел сзади с сумками и пакетами. Брат ещё и на телефон это заснял. Родители вызвали меня "на разговор", потребовали объяснений. У меня не получилось ничего придумать, признался. Отец кричал, что я лох и терпила, позор семьи, мама и брат поддакивали. Сказали, чтобы наследство не ждал, все брату уйдет. И работаю я на фирме приятеля отца, лучше мне самому заявление написать.
    Жена, когда узнала про разговор, тоже орала, что я тупой, раз никакой отмазки не придумал. Теперь она с любовником подумают, как меня наказать, чтобы я на всю жизнь запомнил.
    ПМП.
    Ответить
    • Я слышал, как моя жена говорила в телефонную трубку какому-то Михюсе,
      что я глуп.
      Я сидел в это время под кроватью и меня не было видно.
      О! что я испытывал в этот момент!
      Я хотел выскочить и крикнуть: «Нет, я не глуп!»
      Воображаю, что бы тут было!

      Я опять сидел под кроватью и не был виден.
      Но зато мне-то было видно, что этот самый Михюся проделал с моей женой.

      Сегодня моя жена опять принимала этого Михюсю.
      Я начинаю думать, что я, в глазах жены, перехожу на задний план.
      Михюся даже лазал в ящиках моего письменного стола.
      Я сам сидел под кроватью и не был виден.

      Я сидел опять под кроватью и не был виден.
      Жена и Михюся говорили обо мне в самых неприятных выражениях.
      Я не вытерпел и крикнул им, что они всё врут.
      Ответить
      • Если вы читаете историю, которая начинается на «в N лет меня изнасиловали» (15 <= N <= 19), о чём вы думаете?

        Я думаю, что она шлюха и сама дала на вписке по пьяне.
        Ответить
        • что люди с нормальной башкой ходят по впискам и ебутся, а я со своей грустной социофобией не могу нихуя получать от жизни удовольствие
          Ответить
          • одни на вписках ебуца
            другие на говнокоде сидят

            у нас разделение труда
            Ответить
        • Мы думаем, что с вероятностью 50%, может быть и так, и так. Нужно знать подробности.

          Просто не нужно путать преступление "изнасилование" (достаточно серьезное преступление) с историями типа: "я приехала к нему с ночевкой, думая что мы просто друзья, а он стал меня за коленку трогать". Второе конечно тоже не очень, но на изнасилование не тянет
          Ответить
          • Я сначала подумал, что страницу распидорасило, а оказалось, что страницу распидорасило.
            Ответить
  • Можно сдобрить хвостовой рекурсией (код на Racket)
    (define (reverse sequence)
      (let iter ([lst sequence] [rev empty])
        (if (empty? lst)
            rev
            (iter (cdr lst) (cons (car lst) rev)))))
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8