Здравствуйте, Vzhyk, Вы писали:
V>И зачем там это надо? V>Объясните хоть кто-то, зачем нужна задача обращения списка? Почему V>нельзя пройти список с конца в начало? Или местное население уже дошло V>до той стадии, когда знает только одно направление обхода?
1. Обойти односвязный список с конца в начало, пожалуй, более сложная задача, чем его обращение.
2. Если бы тема называлась "обход списка с конца", то вы видимо задались бы вопросом "почему не обернуть список"? Я угадал?
Re[8]: Задача на собеседовании - обращение списка.
Здравствуйте, Сыроежка, Вы писали:
С>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память! Что может вообще привести к аварийному завершению программы. Вы пишите бред идиота лишь бы любой ценой оправдать свою глупость! Мой вам совет: научитесь сначала программировать!
Во-первых, Сыроежка, Ваше хамство не делает Вам чести. Вы обвиняете всех в непрофессионализме, однако пока не подтвердили собственную компетентность.
Во-вторых, упомянутая задача решается линейно, без рекурсии и без дополнительной памяти. Так что Вам двойка за незнание основ и нежелание думать.
Я бы Вас на работу не взял
_____________________
С уважением,
Stanislav V. Zudin
Re[8]: Задача на собеседовании - обращение списка.
Здравствуйте, Сыроежка, Вы писали:
SVZ>>При совпадении концов двух полилиний их нужно объединить в одну. Если соединяется "голова" с "головой" или "хвост" с "хвостом", то одну из полилиний нужно развернуть. SVZ>>И вот здесь используется наш любимый разворот односвязного списка.
С>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память!
не могли бы вы продемонстрировать, зачем для обращения списка нужна рекурсия?
Re[8]: Задача на собеседовании - обращение списка.
Здравствуйте, Сыроежка, Вы писали:
С>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память! Что может вообще привести к аварийному завершению программы. Вы пишите бред идиота лишь бы любой ценой оправдать свою глупость! Мой вам совет: научитесь сначала программировать!
Я че-то не понимаю. Вот, например, я набросал на коленке.
Здравствуйте, Панда, Вы писали:
П>Здравствуйте, Сыроежка, Вы писали:
С>>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память! Что может вообще привести к аварийному завершению программы. Вы пишите бред идиота лишь бы любой ценой оправдать свою глупость! Мой вам совет: научитесь сначала программировать!
П>Я че-то не понимаю. Вот, например, я набросал на коленке.
П>
П>Где тут рекурсия, где расход стековой памяти? Один проход по списку и две вспомогательные переменные.
Придется повторить уже написанный мною ранее ответ.
Это все хорошо, только до вас не доходит, что вы не имеете доступа к внутреннему строению контейнера! Все эти ссылки на следующий элемент класса являются закрытыми членами класса контейнера и относятся к его реализации. Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали. Поэтому единсчтвенный путь — это делать реверсию значений узлов! А для этого без рекурсивного вызова не обойтись.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, Сыроежка, Вы писали:
С>>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память! Что может вообще привести к аварийному завершению программы. Вы пишите бред идиота лишь бы любой ценой оправдать свою глупость! Мой вам совет: научитесь сначала программировать!
SVZ>Во-первых, Сыроежка, Ваше хамство не делает Вам чести. Вы обвиняете всех в непрофессионализме, однако пока не подтвердили собственную компетентность. SVZ>Во-вторых, упомянутая задача решается линейно, без рекурсии и без дополнительной памяти. Так что Вам двойка за незнание основ и нежелание думать.
SVZ>Я бы Вас на работу не взял
Это все хорошо, только до вас не доходит, что вы не имеете доступа к внутреннему строению контейнера! Все эти ссылки на следующий элемент класса являются закрытыми членами класса контейнера и относятся к его реализации. Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали. Поэтому единсчтвенный путь — это делать реверсию значений узлов! А для этого без рекурсивного вызова не обойтись.
Поэтому вам в ответ, чтобы вы не занимались фантазированием, я предложил бы сделать вашу задачу с использованием конкретного стандартного контейнера С++ std::forward_list. Это же односвязный список, не так ли? И все стало бы на свои места. И сразу же всплыло, что вы изобретаете велосипед, сочиняя свои контейнеры, которые не работают с итераторами, и что вы напрямую обращаетесь к реализации своих контейнеров в клиентском коде, и что вы подменяете стандартную библиотеку, и что вы не тот контейнер выбрали, если вам требуется такая операция, и и.д.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Сыроежка, Вы писали:
SVZ>>>При совпадении концов двух полилиний их нужно объединить в одну. Если соединяется "голова" с "головой" или "хвост" с "хвостом", то одну из полилиний нужно развернуть. SVZ>>>И вот здесь используется наш любимый разворот односвязного списка.
С>>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память!
L>не могли бы вы продемонстрировать, зачем для обращения списка нужна рекурсия?
Да без проблем! Вместо того, чтобы фантазировать, возьмите стандартный контейнер std::forward_list в С++ ( это же односвязный список, не так ли? ) и проделайте эту операцию.
Здравствуйте, Сыроежка, Вы писали:
L>>не могли бы вы продемонстрировать, зачем для обращения списка нужна рекурсия?
С>Да без проблем!
Точно? А что с демонстрацией-то? Где она?
С>Вместо того, чтобы фантазировать, возьмите стандартный контейнер std::forward_list в С++ ( это же односвязный список, не так ли? ) и проделайте эту операцию.
Все понимаю, пятница, вечер, тяжелая неделя... Вот я и проделал 3мя строчками. А почему это нельзя сделать без рекурсии — так и не понял.
Re[10]: Задача на собеседовании - обращение списка.
Здравствуйте, Сыроежка, Вы писали:
L>>не могли бы вы продемонстрировать, зачем для обращения списка нужна рекурсия?
С>Да без проблем! Вместо того, чтобы фантазировать, возьмите стандартный контейнер std::forward_list в С++ ( это же односвязный список, не так ли? ) и проделайте эту операцию.
std::forward_list::reverse
Следующая попытка.
Re[10]: Задача на собеседовании - обращение списка.
Здравствуйте, Сыроежка, Вы писали:
С>Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали. Поэтому единсчтвенный путь — это делать реверсию значений узлов! А для этого без рекурсивного вызова не обойтись.
Зачем для реверсии значений узлов нужна рекурсия?
Re[11]: Задача на собеседовании - обращение списка.
Здравствуйте, samius, Вы писали:
С>>Да без проблем! S>Точно? А что с демонстрацией-то? Где она?
С>>Вместо того, чтобы фантазировать, возьмите стандартный контейнер std::forward_list в С++ ( это же односвязный список, не так ли? ) и проделайте эту операцию. S>Все понимаю, пятница, вечер, тяжелая неделя... Вот я и проделал 3мя строчками. А почему это нельзя сделать без рекурсии — так и не понял.
Забей
У некоторых программистов очень странные правила игры.
Они считают, что использовать можно только стандартные контейнеры, хотя в определенных случаях самописный велосипед может дать массу преимуществ (а иногда велосипед — единственно возможный способ, не все компиляторы одинаково полезны). И будут, как истинные комсомольцы, создавать себе массу проблем, лишь бы не отступить от этого правила.
Они считают, что до С++'11 компиляторов не существовало (как бы мне поюзать std::forward_list в VS2008 ).
И еще они считают, что все алгоритмы за них уже написаны и лежат в библиотеках. Поэтому все, кто пишет что-то свое — лохи и не являются программистами (а кто же тогда пишет библиотеки?).
Тех, кто узнал в этом описании себя, прошу не обижаться тяпница, вечер...
_____________________
С уважением,
Stanislav V. Zudin
Re[12]: Задача на собеседовании - обращение списка.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Забей SVZ>У некоторых программистов очень странные правила игры.
Да дело не в правилах игры. Ситуации бывают всякие, иногда оправданы стандартные решения, иногда нужны свои.
Но при таком обилии высокомерного поноса в сторону задачи и тех, кто такие задает на собеседованиях, будет интересно как этот гуру будет разгребать свои заблуждения относительно единственности методов решения через рекурсию.
Задача определенно классная. Как минимум, в качестве теста на тягу кандидата поучить программировать.
Если с фразы "ну что, с чего начнем? Разворот списка или гномики?" у кандидата крышу не сдуло, можно спокойно продолжать на интересующие темы
Re[8]: Задача на собеседовании - обращение списка.
Здравствуйте, Сыроежка, Вы писали:
С>Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций
Чего?
С>Мой вам совет: научитесь сначала программировать!
Брысь, неуч.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[9]: Задача на собеседовании - обращение списка.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Во-первых, Сыроежка, Ваше хамство не делает Вам чести. Вы обвиняете всех в непрофессионализме, однако пока не подтвердили собственную компетентность.
А он тут местный петросян. Не обращайте внимания.
SVZ>Я бы Вас на работу не взял
В этом вы не одиноки.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[10]: Задача на собеседовании - обращение списка.
Здравствуйте, Сыроежка, Вы писали:
С>Это все хорошо, только до вас не доходит, что вы не имеете доступа к внутреннему строению контейнера!
Интересно, а что мешает выбрать для этих целей подходящий контейнер?
С> Все эти ссылки на следующий элемент класса являются закрытыми членами класса контейнера и относятся к его реализации.
Т.е. все контейнеры, которых нет в std не существуют и ересь?
С> Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали.
А зачем брать этот контейнер? Он фигово подходит к задаче.
С> Поэтому единсчтвенный путь — это
... начать таки думать своей головой.
С>вы изобретаете велосипед, сочиняя свои контейнеры
Это плохо? Сделать контейнер, идеально подходящий под задачу, тогда как все стандартные не годятся — нормальное решение.
С> которые не работают с итераторами
Чтоб написать контейнер, который работает с итераторами надо совсем чуть чуть.
С> и что вы напрямую обращаетесь к реализации своих контейнеров в клиентском коде
Вызов метода reverse () это напрямую? Раз у нас свой контейнер то и метод разворота легко впихивается в имплементацию.
С> и что вы подменяете стандартную библиотеку
Которая не есть серебряная пуля, а всего то набор инструментов для наиболее часто встречающихся задач.
С> и что вы не тот контейнер выбрали, если вам требуется такая операция
Предлагать std::forward_list — это как раз случай когда контейнер выбран неправильно.
Скажи, вьюношЪ с горящими глазами, ты над реальными проектами работал когда нибудь?
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[9]: Задача на собеседовании - обращение списка.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Они считают, что использовать можно только стандартные контейнеры, хотя в определенных случаях самописный велосипед может дать массу преимуществ
Самое смешное что всё что сейчас находится в библиотеках и фреймворках — это бывшие велосипеды.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[7]: Задача на собеседовании - обращение списка.
Здравствуйте, Сыроежка, Вы писали:
С>Так в том-то и дело, что это — никчемная задача! То есть совершенно тупая задача, цель которой продемонстрировать, мол, какой интервьюир остроуминый.
Ух какой баттхёрт!
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[4]: Задача на собеседовании - обращение списка.
Здравствуйте, Vzhyk, Вы писали:
V>Программирует, а не занимается всякой ерундой. Остались же, наверное, V>местные програмерские конторы, где не только списки разворачивать надо V>(кстати зачем), а работать, программы писать.
Слабый вброс, совсем никакой.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[11]: Задача на собеседовании - обращение списка.
Здравствуйте, Трололоша, Вы писали:
Т>Здравствуйте, Сыроежка, Вы писали:
С>>Это все хорошо, только до вас не доходит, что вы не имеете доступа к внутреннему строению контейнера! Т>Интересно, а что мешает выбрать для этих целей подходящий контейнер?
С>> Все эти ссылки на следующий элемент класса являются закрытыми членами класса контейнера и относятся к его реализации. Т>Т.е. все контейнеры, которых нет в std не существуют и ересь?
С>> Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали. Т>А зачем брать этот контейнер? Он фигово подходит к задаче.
С>> Поэтому единсчтвенный путь — это Т>... начать таки думать своей головой.
С>>вы изобретаете велосипед, сочиняя свои контейнеры Т>Это плохо? Сделать контейнер, идеально подходящий под задачу, тогда как все стандартные не годятся — нормальное решение.
С>> которые не работают с итераторами Т>Чтоб написать контейнер, который работает с итераторами надо совсем чуть чуть.
С>> и что вы напрямую обращаетесь к реализации своих контейнеров в клиентском коде Т>Вызов метода reverse () это напрямую? Раз у нас свой контейнер то и метод разворота легко впихивается в имплементацию.
С>> и что вы подменяете стандартную библиотеку Т>Которая не есть серебряная пуля, а всего то набор инструментов для наиболее часто встречающихся задач.
С>> и что вы не тот контейнер выбрали, если вам требуется такая операция Т>Предлагать std::forward_list — это как раз случай когда контейнер выбран неправильно.
Т>Скажи, вьюношЪ с горящими глазами, ты над реальными проектами работал когда нибудь?
Вот вы и демонстрируете свою полную безграмотность, как программист! Я вам с самого начала говорил, что надо подбирать правильный контейнер, а не заниматься самодеятельностью! Что же вы сейчас как попка-дурак за мной повторяете слова, которые я сказал с самого начала?!
Вы уже не знаете, как выкрутиться со своей глупой задачей, а потому со своей больной головыц сваливаете на здоровую! Вы пишите: "Т>Т.е. все контейнеры, которых нет в std не существуют и ересь?" Я где-нибудь это заявлял?! Что вы мне свою безгорамотность навязываете? Вопрос не в том, что контейнеры, которых нет в std:: — это ересь. А в том, что если вам надо леать реверсию списка, то изначально следует выбирать тот контейнер, который для этого наиболее подходит! То есть нужно выбирать двухнаправленный список, который вы можете обходить и в прямом нарпавлении и в обратном, потому что итератор у двухнаправленного контейнера является реверсивный!
Так что собеседование с вами показало, что это именно вы — совершенно безграмотный программист! вы даже задачу не можете грамотно софрмулировать. А задача должна была звучать так: написать реализацию односвзяного списка, имеющего в качестве открытого интерфейса функцию-член, выполняющую реверсию контейнера. Между этой формулировкой и вашей формулировкой — две большие разницы! В первом случае программист понимает, что ему надо изобрести велосипед и реализовать односвязный список с данной функциональностью, а при вашей формулировке программист не понимает, зачем выбран контейнер, у которого нет такой операции и нужно через одно место, то есть открытый интерфейс реализовывать эту функцию!
Я вам продемонстрировал как мысли профессиональный программист. Вы продемонстрировали как мысли безграмотный программист, который сломя голову бежит изобретать велосипед, даже не задумываясь о том, что все выглядет нонсенсом! Только и всего!