Re[6]: Задача на собеседовании - обращение списка.
От: Lloyd Россия  
Дата: 30.03.12 12:01
Оценка: +2 :)))
Здравствуйте, Vzhyk, Вы писали:

V>И зачем там это надо?

V>Объясните хоть кто-то, зачем нужна задача обращения списка? Почему
V>нельзя пройти список с конца в начало? Или местное население уже дошло
V>до той стадии, когда знает только одно направление обхода?

1. Обойти односвязный список с конца в начало, пожалуй, более сложная задача, чем его обращение.
2. Если бы тема называлась "обход списка с конца", то вы видимо задались бы вопросом "почему не обернуть список"? Я угадал?
Re[8]: Задача на собеседовании - обращение списка.
От: Stanislav V. Zudin Россия  
Дата: 30.03.12 12:11
Оценка: +4
Здравствуйте, Сыроежка, Вы писали:

С>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память! Что может вообще привести к аварийному завершению программы. Вы пишите бред идиота лишь бы любой ценой оправдать свою глупость! Мой вам совет: научитесь сначала программировать!


Во-первых, Сыроежка, Ваше хамство не делает Вам чести. Вы обвиняете всех в непрофессионализме, однако пока не подтвердили собственную компетентность.
Во-вторых, упомянутая задача решается линейно, без рекурсии и без дополнительной памяти. Так что Вам двойка за незнание основ и нежелание думать.

Я бы Вас на работу не взял
_____________________
С уважением,
Stanislav V. Zudin
Re[8]: Задача на собеседовании - обращение списка.
От: Lloyd Россия  
Дата: 30.03.12 12:18
Оценка:
Здравствуйте, Сыроежка, Вы писали:

SVZ>>При совпадении концов двух полилиний их нужно объединить в одну. Если соединяется "голова" с "головой" или "хвост" с "хвостом", то одну из полилиний нужно развернуть.

SVZ>>И вот здесь используется наш любимый разворот односвязного списка.

С>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память!


не могли бы вы продемонстрировать, зачем для обращения списка нужна рекурсия?
Re[8]: Задача на собеседовании - обращение списка.
От: Панда Россия  
Дата: 30.03.12 12:55
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память! Что может вообще привести к аварийному завершению программы. Вы пишите бред идиота лишь бы любой ценой оправдать свою глупость! Мой вам совет: научитесь сначала программировать!



Я че-то не понимаю. Вот, например, я набросал на коленке.

struct listRec{
   MyData somedata;
   listRec *next;
}

void Reverse(listRec *&rec)
{
   listRec *tail = rec->next;
   rec->next = NULL;
   while (tail) {
      listRec *tail_next = tail->next;
      tail->next = rec;
      rec = tail;
      tail = tail_next;
   }
}


Где тут рекурсия, где расход стековой памяти? Один проход по списку и две вспомогательные переменные.
Re[9]: Задача на собеседовании - обращение списка.
От: Сыроежка  
Дата: 30.03.12 18:39
Оценка: -3 :))
Здравствуйте, Панда, Вы писали:

П>Здравствуйте, Сыроежка, Вы писали:


С>>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память! Что может вообще привести к аварийному завершению программы. Вы пишите бред идиота лишь бы любой ценой оправдать свою глупость! Мой вам совет: научитесь сначала программировать!



П>Я че-то не понимаю. Вот, например, я набросал на коленке.


П>
П>struct listRec{
П>   MyData somedata;
П>   listRec *next;
П>}

П>void Reverse(listRec *&rec)
П>{
П>   listRec *tail = rec->next;
   rec->>next = NULL;
П>   while (tail) {
П>      listRec *tail_next = tail->next;
      tail->>next = rec;
П>      rec = tail;
П>      tail = tail_next;
П>   }
П>}

П>


П>Где тут рекурсия, где расход стековой памяти? Один проход по списку и две вспомогательные переменные.



Придется повторить уже написанный мною ранее ответ.
Это все хорошо, только до вас не доходит, что вы не имеете доступа к внутреннему строению контейнера! Все эти ссылки на следующий элемент класса являются закрытыми членами класса контейнера и относятся к его реализации. Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали. Поэтому единсчтвенный путь — это делать реверсию значений узлов! А для этого без рекурсивного вызова не обойтись.
Меня можно встретить на www.cpp.forum24.ru
Re[9]: Задача на собеседовании - обращение списка.
От: Сыроежка  
Дата: 30.03.12 18:44
Оценка: :)
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, Сыроежка, Вы писали:


С>>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память! Что может вообще привести к аварийному завершению программы. Вы пишите бред идиота лишь бы любой ценой оправдать свою глупость! Мой вам совет: научитесь сначала программировать!


SVZ>Во-первых, Сыроежка, Ваше хамство не делает Вам чести. Вы обвиняете всех в непрофессионализме, однако пока не подтвердили собственную компетентность.

SVZ>Во-вторых, упомянутая задача решается линейно, без рекурсии и без дополнительной памяти. Так что Вам двойка за незнание основ и нежелание думать.

SVZ>Я бы Вас на работу не взял


Это все хорошо, только до вас не доходит, что вы не имеете доступа к внутреннему строению контейнера! Все эти ссылки на следующий элемент класса являются закрытыми членами класса контейнера и относятся к его реализации. Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали. Поэтому единсчтвенный путь — это делать реверсию значений узлов! А для этого без рекурсивного вызова не обойтись.

Поэтому вам в ответ, чтобы вы не занимались фантазированием, я предложил бы сделать вашу задачу с использованием конкретного стандартного контейнера С++ std::forward_list. Это же односвязный список, не так ли? И все стало бы на свои места. И сразу же всплыло, что вы изобретаете велосипед, сочиняя свои контейнеры, которые не работают с итераторами, и что вы напрямую обращаетесь к реализации своих контейнеров в клиентском коде, и что вы подменяете стандартную библиотеку, и что вы не тот контейнер выбрали, если вам требуется такая операция, и и.д.
Меня можно встретить на www.cpp.forum24.ru
Re[9]: Задача на собеседовании - обращение списка.
От: Сыроежка  
Дата: 30.03.12 18:46
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Сыроежка, Вы писали:


SVZ>>>При совпадении концов двух полилиний их нужно объединить в одну. Если соединяется "голова" с "головой" или "хвост" с "хвостом", то одну из полилиний нужно развернуть.

SVZ>>>И вот здесь используется наш любимый разворот односвязного списка.

С>>Да не фантазируйте! Какая экономия памяти?! Вы пишите плохой код, а потом корячитесь с ним всю оставшуюся жизнь! Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций, которые отнимают больше памяти, чем вы пытаетесь сэкономить, и причем эта память — стековая память!


L>не могли бы вы продемонстрировать, зачем для обращения списка нужна рекурсия?


Да без проблем! Вместо того, чтобы фантазировать, возьмите стандартный контейнер std::forward_list в С++ ( это же односвязный список, не так ли? ) и проделайте эту операцию.
Меня можно встретить на www.cpp.forum24.ru
Re[10]: Задача на собеседовании - обращение списка.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.03.12 19:36
Оценка:
Здравствуйте, Сыроежка, Вы писали:

L>>не могли бы вы продемонстрировать, зачем для обращения списка нужна рекурсия?


С>Да без проблем!

Точно? А что с демонстрацией-то? Где она?

С>Вместо того, чтобы фантазировать, возьмите стандартный контейнер std::forward_list в С++ ( это же односвязный список, не так ли? ) и проделайте эту операцию.

Все понимаю, пятница, вечер, тяжелая неделя... Вот я и проделал 3мя строчками. А почему это нельзя сделать без рекурсии — так и не понял.
Re[10]: Задача на собеседовании - обращение списка.
От: Lloyd Россия  
Дата: 30.03.12 20:00
Оценка:
Здравствуйте, Сыроежка, Вы писали:

L>>не могли бы вы продемонстрировать, зачем для обращения списка нужна рекурсия?


С>Да без проблем! Вместо того, чтобы фантазировать, возьмите стандартный контейнер std::forward_list в С++ ( это же односвязный список, не так ли? ) и проделайте эту операцию.


std::forward_list::reverse

Следующая попытка.
Re[10]: Задача на собеседовании - обращение списка.
От: Lloyd Россия  
Дата: 30.03.12 20:06
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали. Поэтому единсчтвенный путь — это делать реверсию значений узлов! А для этого без рекурсивного вызова не обойтись.


Зачем для реверсии значений узлов нужна рекурсия?
Re[11]: Задача на собеседовании - обращение списка.
От: Stanislav V. Zudin Россия  
Дата: 30.03.12 20:12
Оценка: +1
Здравствуйте, samius, Вы писали:

С>>Да без проблем!

S>Точно? А что с демонстрацией-то? Где она?

С>>Вместо того, чтобы фантазировать, возьмите стандартный контейнер std::forward_list в С++ ( это же односвязный список, не так ли? ) и проделайте эту операцию.

S>Все понимаю, пятница, вечер, тяжелая неделя... Вот я и проделал 3мя строчками. А почему это нельзя сделать без рекурсии — так и не понял.

Забей
У некоторых программистов очень странные правила игры.
Они считают, что использовать можно только стандартные контейнеры, хотя в определенных случаях самописный велосипед может дать массу преимуществ (а иногда велосипед — единственно возможный способ, не все компиляторы одинаково полезны). И будут, как истинные комсомольцы, создавать себе массу проблем, лишь бы не отступить от этого правила.

Они считают, что до С++'11 компиляторов не существовало (как бы мне поюзать std::forward_list в VS2008 ).

И еще они считают, что все алгоритмы за них уже написаны и лежат в библиотеках. Поэтому все, кто пишет что-то свое — лохи и не являются программистами (а кто же тогда пишет библиотеки?).

Тех, кто узнал в этом описании себя, прошу не обижаться тяпница, вечер...
_____________________
С уважением,
Stanislav V. Zudin
Re[12]: Задача на собеседовании - обращение списка.
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.03.12 20:45
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Забей

SVZ>У некоторых программистов очень странные правила игры.

Да дело не в правилах игры. Ситуации бывают всякие, иногда оправданы стандартные решения, иногда нужны свои.

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

Задача определенно классная. Как минимум, в качестве теста на тягу кандидата поучить программировать.
Если с фразы "ну что, с чего начнем? Разворот списка или гномики?" у кандидата крышу не сдуло, можно спокойно продолжать на интересующие темы
Re[8]: Задача на собеседовании - обращение списка.
От: Трололоша  
Дата: 31.03.12 03:20
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Вы ддаже не понимаете, что такая задача по инвертированию списка решается с помощью рекурсивного вызова функций

Чего?

С>Мой вам совет: научитесь сначала программировать!

Брысь, неуч.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[9]: Задача на собеседовании - обращение списка.
От: Трололоша  
Дата: 31.03.12 03:20
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Во-первых, Сыроежка, Ваше хамство не делает Вам чести. Вы обвиняете всех в непрофессионализме, однако пока не подтвердили собственную компетентность.

А он тут местный петросян. Не обращайте внимания.

SVZ>Я бы Вас на работу не взял

В этом вы не одиноки.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[10]: Задача на собеседовании - обращение списка.
От: Трололоша  
Дата: 31.03.12 03:20
Оценка: :)
Здравствуйте, Сыроежка, Вы писали:

С>Это все хорошо, только до вас не доходит, что вы не имеете доступа к внутреннему строению контейнера!

Интересно, а что мешает выбрать для этих целей подходящий контейнер?

С> Все эти ссылки на следующий элемент класса являются закрытыми членами класса контейнера и относятся к его реализации.

Т.е. все контейнеры, которых нет в std не существуют и ересь?

С> Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали.

А зачем брать этот контейнер? Он фигово подходит к задаче.

С> Поэтому единсчтвенный путь — это

... начать таки думать своей головой.

С>вы изобретаете велосипед, сочиняя свои контейнеры

Это плохо? Сделать контейнер, идеально подходящий под задачу, тогда как все стандартные не годятся — нормальное решение.

С> которые не работают с итераторами

Чтоб написать контейнер, который работает с итераторами надо совсем чуть чуть.

С> и что вы напрямую обращаетесь к реализации своих контейнеров в клиентском коде

Вызов метода reverse () это напрямую? Раз у нас свой контейнер то и метод разворота легко впихивается в имплементацию.

С> и что вы подменяете стандартную библиотеку

Которая не есть серебряная пуля, а всего то набор инструментов для наиболее часто встречающихся задач.

С> и что вы не тот контейнер выбрали, если вам требуется такая операция

Предлагать std::forward_list — это как раз случай когда контейнер выбран неправильно.

Скажи, вьюношЪ с горящими глазами, ты над реальными проектами работал когда нибудь?
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[9]: Задача на собеседовании - обращение списка.
От: Трололоша  
Дата: 31.03.12 03:20
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>не могли бы вы продемонстрировать, зачем для обращения списка нужна рекурсия?

Он просто зубную боль лечит клизмами.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[12]: Задача на собеседовании - обращение списка.
От: Трололоша  
Дата: 31.03.12 03:20
Оценка: :)
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Они считают, что использовать можно только стандартные контейнеры, хотя в определенных случаях самописный велосипед может дать массу преимуществ

Самое смешное что всё что сейчас находится в библиотеках и фреймворках — это бывшие велосипеды.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[7]: Задача на собеседовании - обращение списка.
От: Трололоша  
Дата: 31.03.12 03:20
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Так в том-то и дело, что это — никчемная задача! То есть совершенно тупая задача, цель которой продемонстрировать, мол, какой интервьюир остроуминый.

Ух какой баттхёрт!
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[4]: Задача на собеседовании - обращение списка.
От: Трололоша  
Дата: 31.03.12 03:20
Оценка:
Здравствуйте, Vzhyk, Вы писали:

V>Программирует, а не занимается всякой ерундой. Остались же, наверное,

V>местные програмерские конторы, где не только списки разворачивать надо
V>(кстати зачем), а работать, программы писать.

Слабый вброс, совсем никакой.
... << RSDN@Home>>
Да, йа зелёный тролль!
Re[11]: Задача на собеседовании - обращение списка.
От: Сыроежка  
Дата: 31.03.12 15:24
Оценка: -1 :)
Здравствуйте, Трололоша, Вы писали:

Т>Здравствуйте, Сыроежка, Вы писали:


С>>Это все хорошо, только до вас не доходит, что вы не имеете доступа к внутреннему строению контейнера!

Т>Интересно, а что мешает выбрать для этих целей подходящий контейнер?

С>> Все эти ссылки на следующий элемент класса являются закрытыми членами класса контейнера и относятся к его реализации.

Т>Т.е. все контейнеры, которых нет в std не существуют и ересь?

С>> Если вам не понятно, то возьмите контейнер std::forward_list и попробуйте сделать то, что вы проделали.

Т>А зачем брать этот контейнер? Он фигово подходит к задаче.

С>> Поэтому единсчтвенный путь — это

Т>... начать таки думать своей головой.

С>>вы изобретаете велосипед, сочиняя свои контейнеры

Т>Это плохо? Сделать контейнер, идеально подходящий под задачу, тогда как все стандартные не годятся — нормальное решение.

С>> которые не работают с итераторами

Т>Чтоб написать контейнер, который работает с итераторами надо совсем чуть чуть.

С>> и что вы напрямую обращаетесь к реализации своих контейнеров в клиентском коде

Т>Вызов метода reverse () это напрямую? Раз у нас свой контейнер то и метод разворота легко впихивается в имплементацию.

С>> и что вы подменяете стандартную библиотеку

Т>Которая не есть серебряная пуля, а всего то набор инструментов для наиболее часто встречающихся задач.

С>> и что вы не тот контейнер выбрали, если вам требуется такая операция

Т>Предлагать std::forward_list — это как раз случай когда контейнер выбран неправильно.

Т>Скажи, вьюношЪ с горящими глазами, ты над реальными проектами работал когда нибудь?


Вот вы и демонстрируете свою полную безграмотность, как программист! Я вам с самого начала говорил, что надо подбирать правильный контейнер, а не заниматься самодеятельностью! Что же вы сейчас как попка-дурак за мной повторяете слова, которые я сказал с самого начала?!
Вы уже не знаете, как выкрутиться со своей глупой задачей, а потому со своей больной головыц сваливаете на здоровую! Вы пишите: "Т>Т.е. все контейнеры, которых нет в std не существуют и ересь?" Я где-нибудь это заявлял?! Что вы мне свою безгорамотность навязываете? Вопрос не в том, что контейнеры, которых нет в std:: — это ересь. А в том, что если вам надо леать реверсию списка, то изначально следует выбирать тот контейнер, который для этого наиболее подходит! То есть нужно выбирать двухнаправленный список, который вы можете обходить и в прямом нарпавлении и в обратном, потому что итератор у двухнаправленного контейнера является реверсивный!

Так что собеседование с вами показало, что это именно вы — совершенно безграмотный программист! вы даже задачу не можете грамотно софрмулировать. А задача должна была звучать так: написать реализацию односвзяного списка, имеющего в качестве открытого интерфейса функцию-член, выполняющую реверсию контейнера. Между этой формулировкой и вашей формулировкой — две большие разницы! В первом случае программист понимает, что ему надо изобрести велосипед и реализовать односвязный список с данной функциональностью, а при вашей формулировке программист не понимает, зачем выбран контейнер, у которого нет такой операции и нужно через одно место, то есть открытый интерфейс реализовывать эту функцию!

Я вам продемонстрировал как мысли профессиональный программист. Вы продемонстрировали как мысли безграмотный программист, который сломя голову бежит изобретать велосипед, даже не задумываясь о том, что все выглядет нонсенсом! Только и всего!
Меня можно встретить на www.cpp.forum24.ru
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.