LINUX.ORG.RU

рекурсивная => нерекурсивная реализация

 


1

4

любая рекурсия может быть привращена в итеративную запись, правильно? (тезис Черча)

подскажите алгоритм, который умеет символьно производить такую операцию, например для языков Java/C/C++ ? Может кто-то уже налабал готовый тул?

причина вопроса в том, что некоторые вещи интуитивно записывать именно в рекурсивной форме, а в указанных языках рекурсией пользоваться небезопасно (= нельзя)

ps, наверное такую ересь сейчас ляпнул xD Если б такой тул существовал, создатели этих языков давно бы уже бы его туда запилили, они ж не школьники как ТС



Последнее исправление: maxcom (всего исправлений: 2)
Ответ на: комментарий от stevejobs

Tail и не-tail очень разные, как минимум нужно определить нужен стек или нет, потому и алгоритмы будут разные.

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

к итерации можно привести все ф-и, которые являются общерекурсивными (и некоторые частично-рекурсивные, наверное)

не возвращаемся сюда пока не освоим хотя бы базовые понятия теории гёделя.

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

не возвращаемся сюда пока не освоим хотя бы базовые понятия теории гёделя.

теории гёделя.

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

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

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

взаимно :)

почему же ты, утверждая что знаешь ответ на вопрос тс-а, не приводишь его?

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

взаимно :)

Я и не использую.

почему же ты, утверждая что знаешь ответ на вопрос тс-а, не приводишь его?

Я привел ответ. Нету способа, который бы привел рекурсивную форму к итерационной, как минимум, потому, что существуют частично-рекурсивные ф-и, для которых не существует итерационной формы.

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

Я и не использую.

сомневаюсь.

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

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

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

Интересно...

любая примитивно рекурсивная функция является частично рекурсивной, так как по определению операторы для построения частично рекурсивных функций включают в себя операторы для построения примитивно рекурсивных функций.

То есть, вообще низзя.

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

сомневаюсь.

Зря.

существую невычислимые частично-рекурсивные функции.

Нет, не существуют. Потому что «частично-рекурсивная функция» и «вычислимая функция» - синонимы.

ты же грозился привести любую вычислимую (множество общерекурсивных функций совпадает с множеством вычислимых — см тезис чёрча-тьюринга

Общерекурсивные ф-и - подмножество частично-рекурсивных. В частности, все общерекурсивные функции останавливаются.

начни пруфец, пожалуй, с аккермана.

ф-я Аккермана - частично-рекурсивная, но не общерекурсивная. Я вижу, что ты читал статью в википедии, но это было давно. Перечитай.

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

не общерекурсивная

не примитивно-рекурсивная офк

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

Ты не понял. Твое утверждение противоречиво. Еще раз

любая примитивно рекурсивная функция является частично рекурсивной

Кроме того:

Термины «частично рекурсивная функция» и «общерекурсивная функция» прижились в силу исторических причин и по сути являются результатом неточного перевода английских терминов partial recursive function и total recursive function, которые по смыслу более правильно переводить как «рекурсивные функции, определенные на части множества возможных аргументов» и «рекурсивные функции, определенные на всём множестве возможных аргументов»

что же мешает ф-ции, определенной на всем множестве быть переписанной в итеративный вид? Я например, не вижу препятствий.

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

видимо проблема в том, что ты получаешь знания из википедии :) я проверил, там допущена ретранслируемая тобой ошибка :)

В частности, все общерекурсивные функции останавливаются.

молодец. осталась самая малость: научиться делать логические выводы. на этот раз я сделаю это за тебя: ... и поэтому являются вычислимыми по тьюрингу :)

ф-я Аккермана - частично-рекурсивная, но не общерекурсивная.

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

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

Ты не понял. Твое утверждение противоречиво.

Где оно противоречиво? Примитивно-рекурсивная функция является частинчо-рекурсивной, но не наоборот. По-этому если что-то верно для примитивно-рекурсивной ф-и - это не значит, что оно верно для частично-рекурсивных.

Например проблема останова для примитивно-рекурсивных ф-й тривиально разрешима. Для частично-рекурсивных - нет.

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

Я например, не вижу препятствий.

Если ф-я частично-рекурсивна то она может потреблять потенциально бесконечное количество памятидля данных аргументов (то есть потребление памяти невычислимо). Если ф-я примитивно-рекурсивная - то только фиксированное (потребление памяти вычислимо).

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

молодец. осталась самая малость: научиться делать логические выводы. на этот раз я сделаю это за тебя: ... и поэтому являются вычислимыми по тьюрингу :)

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

ты лжёшь.

Нет, просто опечатка. Я ее сразу же и поправил в непосредственно следующем посте.

anonymous
()

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

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

Не силен в математике, но я вообще, честно говоря не понял даже значения «определенные на части множества возможных аргументов» Сначала создай подмножество из множества возможных аргументов, а затем вычисляй уже на этом подмножестве, и у тебя будет уже «определенные на всём множестве возможных аргументов» А смысл тот же самый.

Демагогия какая то...

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

Посмотри исходники любого компилятора. Если дампать в стек все переменные функции, то любую рекурсивную функцию можно превратить в нерекурсивную. Другое дело, что это её ни разу не оптимизирует.

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

Это какбы и так всем понятно. Вопрос автора был - возможно ли переписать любую функцию так, чтобы она не использовала стек или его аналоги (то есть заменить рекурсивную процедуру итерацией). Ответ, очевидно, нет.

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

Лол, anonimous снова думает, что в чем-то разобрался.

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

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

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

Если дампать в стек

функция которая использует стек (в любом виде) - рекурсивная. Не важно, в каком виде ты рекурсию _записываешь_ - либо в виде func(x), явно, либо в виде набора примитивных инструкций push/call/jmp/pop/ret - процесс остается рекурсивным. Вопрос в том можно ли из рекурсивного процесс сделать нерекурсивный, например как тут:

1:
fact 0 = 1
fact n = n*fact(n-1) 
//рекурсивный процесс, можно переписать в CPS завелосипедить свой стек и т.п. - эти трансформации можно сделать автоматически и убирают явную рекурсию, но процесс остается рекурсивным

2:
fact 0 acc = acc
fact n acc = fact (n-1) (n*acc)
//итерационный процесс, хоть и выражен в виде рекурсии
Вопрос - любую ли ф-ю вида 1 можно привести к виду 2. Ответ - нет.

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

Не силен в математике, но я вообще, честно говоря не понял даже значения «определенные на части множества возможных аргументов» Сначала создай подмножество из множества возможных аргументов, а затем вычисляй уже на этом подмножестве, и у тебя будет уже «определенные на всём множестве возможных аргументов»

Смысл в том, что по ф-и нельзя вычислить это «подмножество» допустимых аргументов.

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

итерационный процесс, хоть и выражен в виде рекурсии

с чего ты взял?

любую ли ф-ю вида 1 можно привести к виду 2. Ответ - нет.

Простой пример можно? То есть, если я на каком-то этапе создаю структуру для временного сохранения данных это все равно рекурсия?

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

Простой пример можно? То есть, если я на каком-то этапе создаю структуру для временного сохранения данных это все равно рекурсия?

Если у тебя на каждом шаге память нарастает - значит процесс рекурсивен

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

Если бы хоть раз за это время показали, где указание на эту «цель» в посте топикстартера, это было бы гораздо эффективнее.

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

в смысле, где ты увидел тут выражение в виде рекурсии? Это же цикл у тебя, пусть и с сахаром.

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

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

Если бы хоть раз за это время показали, где указание на эту «цель» в посте топикстартера

Человек отличается от машины тем, что способен понимать контекст, а не просто воспринимать слова буквально. Ты, видимо, не способен, если вопроса ТС не понял. Если тебе хочется явных указаний - то обрати внимание на упоминание ТСом небезопасности рекурсии (то есть то самое использование стека).

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

Если у тебя на каждом шаге память нарастает - значит процесс рекурсивен

То есть, вот это:

fact=function(n){
  var result = 1, stack=[]
  while(n) stack.push(n--) 
  while(stack.length) result*=stack.pop() 
  return result
}
Рекурсивный процесс?

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

Рекурсивный, но его можно переписать нерекурсивно, выделив в самом начале кусок памяти размером n.

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

Существуют вычислимые по тьюрингу функции, которые не являются общерекурсивными

опять лжёшь :) или ты уже опроверг тезис чёрча-тьюринга?

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

это потому что ты ещё не понял рекурсию :)

область определения относится не к самой функции, а к оператору минимизации

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

опять лжёшь :)

Тезис Черча-Тьюринга устанавливает соответствие между частично-рекурсивными ф-ми и мт, а не между общерекурсивными и мт. Для общерекурсивных ф-й, ВНЕЗАПНО, проблема останова разрешима. А для мт - нет. Тебя это не смущает?

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

а к оператору минимизации

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

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

у тс-а в посте ничего кроме наркоманского бреда нет. какие цепи?

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

ВНЕЗАПНО на википедии насрали неадекваты, а ты за ними повторяешь. как не стыдно? тезис чёрча-тьюринга постулирует эквивалентность множеств вычислимых и общерекурсивных функций. возьми уже книжку в руки, наконец...

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

тезис чёрча-тьюринга постулирует эквивалентность множеств вычислимых и общерекурсивных функций.

Еще раз, для дебилов. МТ, соответствующие общерекурсивным функциям, _всегда завершаются_. Куда ты дел МТ, которые могут зависнуть?

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

эти функции НЕ являются вычислимыми по тьюрингу

Лолд. Функция, которую можно вычислить на МТ, не является вычислимой по Тьюрингу, оказывается! Пиздец ты дебил. Открой уже учебник какой-нибудь и прочитай, хватит позориться.

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

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

Бред. «Итерационная форма» и примитивно-рекурсивные функции никак не связаны.

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

Напоминаю, что под «итерационной формой» понимается вычислительный процесс, во время исполнения которого не происходит динамического выделения памяти на каждой итерации. Так что связаны напрямую - к итерационной форме приводятся те и только те функции, которые позволяют вычислить на основе входа количество данных. Для примитивно-рекурсивных ф-й эта задача разрешима. Для частично-рекурсивных - нет.

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

я не отрицаю, что общаться с необразованным быдлом непросто.

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

с альтернативной наукой прошу не беспокоить. это к фоменко и ко.

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

согласен, бред. но зачем ты его принёс сюда?

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

Напоминаю, что под «итерационной формой» понимается вычислительный процесс, во время исполнения которого не происходит динамического выделения памяти на каждой итерации.

Сам придумал?

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