|
|
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Подскажите, как обернуть очередь за линейное время? Более подробно: на вход подается список, [1,2,3,4] например. На выходе должно получится [4,3,2,1] Использовать можно только! операции чтения с конца в начало и операцию дописывания элемента в начало списка. Программа должна отработать за линейное время ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 15:52 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Рекурсия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 16:22 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, забыл написать. Свои функции, кроме 2-х оговоренных писать и использовать можно, но они не должны никак использовать рекурсию и основываться на чем-либо кроме 2-х оговоренных функций и лямбда выражений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 16:26 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Любые лямбда-выражения? Каков язык реализации? Python? Можно прикольнуться и сделать через комбинатор неподвижной точки %)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 16:33 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Выполнять собираюсь на F#. Но приемлим любой функциональный язык, Haskel, например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 16:36 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Эфшарпа нет, есть питон. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 17:12 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Спасибо. Постараюсь разобраться и оттранслировать в том или ином виде на шарпы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 17:15 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Ещё есть Scheme. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Я, впрочем, сильно сомневаюсь, что хотели именно этого. Просто забавный обход ограничения на использование рекурсии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 17:48 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Большое спасибо) Вечером подниму питон поминимуму, разберусь в ваших примерах, надеюсь, что без потери всех условий и роста сложности удастся без проблем портировать. Еще раз большое спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 17:52 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
junior idiotЭфшарпа нет, есть питон. Код: plaintext 1. 2. 3. Ох и накрутил ) Не соответствует условию: umniaxa Использовать можно только! операции чтения с конца в начало и операцию дописывания элемента в начало списка. Тут я понимаю на оборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 18:18 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Ну да, кручу-верчу, что считать "началом", а что "концом" -- в общем, не принципиально. Можно и наоборот: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 18:26 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Формаль ность но всеже :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 18:34 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
umniaxaСвои функции, кроме 2-х оговоренных писать и использовать можно, но они не должны никак использовать рекурсию странное ограничение... а что тогда, цикл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 23:27 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
junior idiotПросто забавный обход ограничения на использование рекурсии. это не обход, а рекурсия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2010, 23:28 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
k0rvinэто не обход, а рекурсия. Формально -- нет. Комбинатор неподвижной точки как раз и нужен для того, чтобы рекурсивное определение преобразовать в не рекурсивное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 00:21 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Немного поясню. Дело в том, что это можно "собрать" в одну строчку: Код: plaintext 1. В Scheme то же самое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 00:27 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
junior idiot, Я не очень шарю в лябда выражениях... но для меня этот пример выглядит, как способ вызова из функции самой себя при условии, что "свое" имя она не знает. Да и выражение типа "lambda g: ............. " - разве ж это не определение функции ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 01:03 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
clihlt, О первая ссылка ,что попалась Тынц автор Комбинаторы неподвижной точки позволяют определять анонимные рекурсивные функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 01:07 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
clihltдля меня этот пример выглядит, как способ вызова из функции самой себя при условии, что "свое" имя она не знает. Как она тогда себя вызывает? clihltДа и выражение типа "lambda g: ............. " - разве ж это не определение функции ? Скорее запись функции. Чтобы она стала определением , функцию надо поименовать, то есть, строго говоря, "определяется" не сама функция, а её имя, связываясь с конкретным лямбда-выражением. http://en.wikipedia.org/wiki/Definition]A definition is a passage that explains the meaning of a term (a word, phrase or other set of symbols), or a type of thing. The term to be defined is the definiendum (plural definienda). Впрочем, это не более чем игра слов. Потому я и сказал, что, видимо, от ТС ждут другого решения. Хотя ни одного определения рекурсии, в котором не использовалось бы слово "definition", то есть относящегося также и к анонимным функциям, я не нашёл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 08:33 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Поясните пожалуйста еще один момент, я правильно понимаю, что в операции Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 12:42 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
umniaxa , именно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 12:45 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Мдя) Тогда к сожалению это и есть то условие - которое делает ваше предложенное решение неприемлимым... сложность задачи как раз и состоит в том, что с любыми списками можно сделать ровно 2 операции: прочитать эл-ты с конца к началу (причем именно прочитать, а не прочитать и удалить) и дописать в существующий список (ну или в некий новый) 1 эл-т в начало ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 12:57 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Причем все это за линейное время.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 12:58 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
umniaxaпрочитать эл-ты с конца к началу (причем именно прочитать, а не прочитать и удалить) Предположу, что вы таки неверно поняли этот момент условия задачи, так получается совсем нелепица. Очередь -- это вполне чёткая абстракция, на ней определена операция ( dequeue , или иногда pop , хотя это несовсем корректно) " извлечения элемента, который был добавлен раньше всех оставшихся" (называть это "началом" или "концом" -- не принципиально, хотя правильнее, конечно, называть "началом"). Иначе вот какая бессмыслица получается: если элементы не удаляются, а только читаются, то 1) либо очередь сама "помнит" сколько раз был считан крайний элемент и сдвигает счётчик, чтобы в следующий раз выдать следующий элемент; тогда это ничем внешне не отличается от извлечения (удаления элементов); 2) либо можно считывать произвольный элемент очереди в любой момент времени; тогда это не очередь вообще, а список. Короче, приведите интерфейс этой "очереди"; если он "классический", то предложенное решение (особенно для Scheme -- там вообще один-в-один) вполне корректно с точки зрения используемых операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 13:09 |
|
||
|
Реверт очереди за линейное время
|
|||
|---|---|---|---|
|
#18+
Полностью условие звучит так: Используя только операцию foldr и лямбда выражения ревертнуть список не использую рекурсивных функций за линейное время foldr f arg работает приблизительно так: foldr (+) 0 [1,2,3,4] = ((((0+4)+3)+2)+1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2010, 14:04 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36893671&tid=1342094]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
148ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 442ms |

| 0 / 0 |
