LINUX.ORG.RU

рекурсия и итерация

 итерация,


1

3

Приветствую всех.
Вопрос мой довольно праздный, и возможно кому-то покажется бесполезным. Тем не менее. Не кажется ли вам, что то что сейчас понимается под этими 2 терминами несколько не соответствует действительности. Вот что я имею в виду. У нас есть рекурсивный процесс, он интуитивно понятен на примерах трельяжа, стихотворения «у попа была собака» и пр. В программировании он может быть выражен 2-мя способами: с помощью итерациии и с помощью того, что принято называть рекурсией
На концептуальном уровне, это, безусловно, неверно, поскольку мы имеем 1 процесс и 2 способа его реализации, и называть способ реализации процесса самим процессом не совсем правильно. Таким образом, я хочу сказать, что выражение «рекурсивная реализация алгоритма» значит то же, что «рекурсивная реализация рекурсивного алгоритма» - бессмысленный набор слов, и, при этом, сама реализация, собственно не имеет ничего общего с рекурсией
Хотелось бы попросить воздержаться от постов вроде «Ты не знаешь язык X и математическую теорию Y, поэтому ты чмо». Если то, что я написал кажется вам глупостью, просто проходите мимо.
Итак, ваши мнения, Господа.

Ответ на: комментарий от emulek

в итерации ты просто последовательно перебираешь множество.

последовательный перебор множества ты тоже можешь представить «рекурсивной» записью.

(define tst (lambda(lst) (if (not (null? lst)) (do-staff))))

anonimous
() автор топика
Ответ на: комментарий от Waterlaz

Не, если мы говорим о процессах, то тут несколько иная история. Процесс итеративен, если он зависит только от своего предыдущего состояния и рекурсивен, если от всех предыдущих. Грубо говоря. То, что ты предыдущие состояния запихаешь в свой стек ничего не поменяет - процесс останется рекурсивным.

anonymous
()
Ответ на: комментарий от anonymous

Ты не понял. Твоя поповская собака рекурсивна лишь до тех пор, пока мы рассматриваем её как рекурсивную, т.е. условно говоря «пусть х - история, тогда х = начало+х+конец». А если рассматривать её как последовательность одинаковых фраз, т.е. х = начало*n+конец*n, где n=∞, то это итеративная задача.

Я не совсем понял, но смысл в том, что в конце истории «Написал», ты инициируешь рекурсивное повторение той же истории. Там нет никакого конца, вычисления идут «вглубь»

anonimous
() автор топика
Ответ на: комментарий от anonymous

Ну, я назову всю историю состояний рекурсивного процесса просто состоянием и процесс превратится в итеративный по определению.

Waterlaz ★★★★★
()
Ответ на: комментарий от anonymous

Нет, не превратиться. Подумай о степени роста твоего «состояния».

Вы имеете в виду рост на реальной машине? Если не на машине а вообще - то процесс линейный и бесконечный, это даже не рост собственно, ну и что?

anonimous
() автор топика
Ответ на: комментарий от anonymous

Нет, не превратиться. Подумай о степени роста твоего «состояния».

И что? Теперь любой прожорливый к памяти алгоритм будем называть от этого рекурсивным?

Waterlaz ★★★★★
()
Ответ на: комментарий от anonimous

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

anonymous
()
Ответ на: комментарий от Waterlaz

Не любой, а рекурсивный. Та или иная реализация рекурсивного алгоритма может порождать итеративный или же (линейно-, древовидно-, экспоненциально-, ...)рекурсивный процесс.

anonymous
()
Ответ на: комментарий от anonymous

Итеративный процесс не приводит к такому росту. При этом алгоритм все-равно может быть рекурсивным(определенным через самого себя).

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

anonimous
() автор топика
Ответ на: комментарий от anonimous

Тебе где-то придётся запоминать, куда тебе вернуться

И что, нельзя это запоминание реализовать в цикле?

нет. Только с дополнительным стеком. Или попробуй сделать обход бинарного дерева или qsort циклом, что-бы опровергнуть мои слова.

emulek
()
Ответ на: комментарий от anonymous

Не, если мы говорим о процессах, то тут несколько иная история. Процесс итеративен, если он зависит только от своего предыдущего состояния и рекурсивен, если от всех предыдущих. Грубо говоря. То, что ты предыдущие состояния запихаешь в свой стек ничего не поменяет - процесс останется рекурсивным.

Итеративный процесс косвенно все равно зависит от всех предыдущих состояний, иначе как бы он пришел в данную точку. Неважно, сохранено ли каждое состояние в памяти или нет

anonimous
() автор топика
Ответ на: комментарий от anonimous

Тем и отличается рекурсия от итерации, в итерации ты просто последовательно

А кто запрещает прыгнуть назад при переборе?

то, что в одном числе(счётчике итераций) хранится одно число. Потому прыгать ты можешь только вперёд, и только на одну итерацию. Иначе это уже не итерации.

emulek
()
Ответ на: комментарий от anonymous

Я полагаю, что имеется в виду свой стек. Тогда можно любую итерацию заменить на цикл. Часто он действительно быстрее работает.

пофиг, как он работает. Это уже не просто цикл, а цикл с возвратом и памятью для возврата. Т.е. рекурсия.

emulek
()
Ответ на: комментарий от invy

Машина Тьюринга тоже о рекурсии не знает.

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

emulek
()
Ответ на: комментарий от emulek

нет. Только с дополнительным стеком. Или попробуй сделать обход бинарного дерева или qsort циклом, что-бы опровергнуть мои слова.

То есть если программа требует дополнительную память, она уже рекурсивная?

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Не «именно для рекурсии», а «именно для вызова подпрограмм».

пруф можно? Из подпрограмм можно возвращаться без всякого стека. Я возвращался, делал тест памяти для Z80. Оно у меня вообще без памяти работало.

emulek
()
Ответ на: комментарий от emulek

BTW, всегда хотел узнать, а почему в массы пошла машина Тьюринга а не Поста? Ведь машина Поста проще, а значит более подходящая в качестве формализма?

anonimous
() автор топика
Ответ на: комментарий от Waterlaz

Тогда ответь на следующие вопросы:

у тебя собеседование на носу что-ли? А я значит бесплатный репетитор для тебя?

emulek
()
Ответ на: комментарий от Waterlaz

К тому, что я любой алгоритм могу вывернуть и в рекурсию, и в итеративный процесс.

«итеративный» он будет лишь при наличии дополнительной памяти неизвестного объёма. Потому в кавычках. Без кавычек итеративен лишь алгоритм требующий O(1) памяти.

Естественно стек можно юзать какой угодно, не обязательно тот, что в CPU на esp.

emulek
()
Ответ на: комментарий от emulek

у тебя собеседование на носу что-ли? А я значит бесплатный репетитор для тебя?

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

Waterlaz ★★★★★
()
Ответ на: комментарий от emulek

«итеративный» он будет лишь при наличии дополнительной памяти неизвестного объёма. Потому в кавычках. Без кавычек итеративен лишь алгоритм требующий O(1) памяти.

Вот тут уже хотя бы что-то стало проясняться.

Правильно ли я понимаю, что любой алгоритми, требующий больше O(1) памяти, уже будет рекурсивным?

Waterlaz ★★★★★
()
Ответ на: комментарий от emulek

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

invy ★★★★★
()
Ответ на: комментарий от anonymous

Т.е. если он в процессе работы прямо или косвенно обращается к себе же. Как ты это сделаешь, через рекурсивный вызов функции или же через goto - неважно.

важен контекст. Если он один, или он всегда одинаковый — это итерация. Если контекстов много — рекурсия. Например (n-1)!*n это рекурсивное определение факториала, потому-что внутреннее определение нельзя вынуть из контекста, оно не на хвосте. Нужно существенно переделать алгоритм, например умножать в другом порядке, не от n, а от 1, тогда будет итерация. Но это уже другой алгоритм(реализация). В данном случае — не имеет значения(если нет потерь точности).

emulek
()
Ответ на: комментарий от anonimous

в итерации ты просто последовательно перебираешь множество.

последовательный перебор множества ты тоже можешь представить «рекурсивной» записью.

конечно. Ибо итерация — частный случай рекурсии.

emulek
()
Ответ на: комментарий от Waterlaz

о чем вы тут вообще оба? Итерация - это тоже рекурсия.

anonymous
()
Ответ на: комментарий от anonimous

Да какая разница со стеком или без стека, или с 10 стеками? Вопрос не в этом.

вопрос и разница именно в этом. При итерации у тебя либо один контекст, либо n+1-й контекст прямо следует из n-ного.

emulek
()
Ответ на: комментарий от Waterlaz

Ты путаешь понятие рекурсивного алгоритма с понятием рекурсивного процесса. Тебе тут уже объяснили.

anonymous
()
Ответ на: комментарий от anonimous

А в двух счетчиках сколько хранится чисел? А в 100?

в C счётчиках хранится O(C) === O(1) чисел.

emulek
()
Ответ на: комментарий от Waterlaz

Кто сказал, что из одного? О чем ты?

о том, что константа эквивалентна единице. Она не растёт. Т.е. если алгоритм требует Over9000 байтов, но это константа, то этот алгоритм, будучи итеративным, может выполнять ЛЮБОЕ число итераций. А если рекурсивный, то память рано или поздно кончится. ЛЮБАЯ память. В этом и разница.

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

emulek
()
Ответ на: комментарий от Waterlaz

То есть если программа требует дополнительную память, она уже рекурсивная?

типа того. Точнее: если программа рекурсивная, она требует память. Потому-что каждая рекурсия _может_ выполняться в _своём_ контексте. А вот для итерации это не нужно, любая итерация _может_ выполняться в общем контексте, который _может_ быть единственный (точнее их число — заранее известная константа не зависящая от числа итераций).

emulek
()
Ответ на: комментарий от anonimous

всегда хотел узнать, а почему в массы пошла машина Тьюринга а не Поста?

ты ещё спроси, что слаще, хрен или редька? И почему массы говорят «хрен его знает», а не «редька в курсе»?

Какая разница-то? AFAIK Тьюринг более внятно всё написал.

emulek
()
Ответ на: комментарий от Waterlaz

Правильно ли я понимаю, что любой алгоритми, требующий больше O(1) памяти, уже будет рекурсивным?

нет, неправильно. Конечно любой алгоритм можно переписать так, что-бы на n шагов он пожрал O(n!) памяти. Дурное дело не хитрое.

emulek
()
Ответ на: комментарий от emulek

Какая разница-то?

Разница в том, что:

машина Поста проще, а значит более подходящая в качестве формализма.

anonimous
() автор топика
Ответ на: комментарий от anonimous

машина Поста проще, а значит более подходящая в качестве формализма.

из «проще» совсем не следует «подходит».

Ну и само понятие «проще» ты не формализовал. Или ты про мнение авторов википедии?

emulek
()
Ответ на: комментарий от emulek

Ну и само понятие «проще» ты не формализовал. Или ты про мнение авторов википедии?

Я первый раз слышу чтобы это подвергали сомнению. Это общеизвестный факт.
Я кстати сейчас нарыл инфу, которая какбэ проясняет

Turing's paper was received for publication in May 1936, followed by Post's in October

и, при этом:

were developed independently

Мы верим, да, да

anonimous
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.