1. Haskell / Говнокод #28596

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 10 Февраля 2023

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

    • Я хочу вот такой: (5 4 3 2 1)
      А он вот такой: ((((5 . 4) . 3) . 2) . 1)
      Ответить
      • Почитал, как устроены списки в Лиспе.
        (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. Ну то есть числовые значения остаются на месте, а вот связи к ним строятся новые без разрушения старого списка.
          Ответить
    • Используй defun
      Ответить
      • > de-fun

        я не могу отказаться от веселья, у меня его и так нет
        Ответить
        • https://external-preview.redd.it/0JKWr4ilhe0Obzbz_4ZFNvMB-LAw1tEB0bFTJqDTSRo.jpg?auto=webp&s=cd85fb7a7ba78ef9e5ebaf845e9f30b41b570d64
          Ответить
    • У нас с женой куколд отношения. Когда начали встречаться, она сказала, что иной формат для нее неприемлем. Я очень влюблен был, пересилил себя, а потом привык.
      А тут не повезло. Брат увидел нас. Жена шла с любовником, они обнимались, целовались, а я шел сзади с сумками и пакетами. Брат ещё и на телефон это заснял. Родители вызвали меня "на разговор", потребовали объяснений. У меня не получилось ничего придумать, признался. Отец кричал, что я лох и терпила, позор семьи, мама и брат поддакивали. Сказали, чтобы наследство не ждал, все брату уйдет. И работаю я на фирме приятеля отца, лучше мне самому заявление написать.
      Жена, когда узнала про разговор, тоже орала, что я тупой, раз никакой отмазки не придумал. Теперь она с любовником подумают, как меня наказать, чтобы я на всю жизнь запомнил.
      ПМП.
      Ответить
      • Я слышал, как моя жена говорила в телефонную трубку какому-то Михюсе,
        что я глуп.
        Я сидел в это время под кроватью и меня не было видно.
        О! что я испытывал в этот момент!
        Я хотел выскочить и крикнуть: «Нет, я не глуп!»
        Воображаю, что бы тут было!

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

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

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

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

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

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

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