Чи завжди ви можете перетворити рекурсивну функцію в ітеративну? Так, абсолютно, і теза Церкви Тьюрінга доводить це, якщо служить пам'ять. Простіше кажучи, він зазначає, що те, що можна обчислити рекурсивними функціями, обчислюється за допомогою ітеративної моделі (наприклад, машини Тьюрінга) і навпаки. Дисертація не говорить вам точно про те, як зробити конверсію, але вона говорить, що це, безумовно, можливо.
У багатьох випадках перетворення рекурсивної функції легко. Кнут пропонує кілька прийомів у «Мистецтві комп’ютерного програмування». І часто річ, обчислена рекурсивно, може бути обчислена зовсім іншим підходом за менший час та простір. Класичним прикладом цього є числа Фібоначчі або їх послідовності. Ви напевно зіткнулися з цією проблемою у своєму плані ступеня.
Зворотній бік цієї монети, ми, звичайно, можемо уявити, що система програмування настільки вдосконалена, щоб трактувати рекурсивне визначення формули як запрошення на запам'ятовування попередніх результатів, пропонуючи таким чином перевагу швидкості без клопоту сказати комп’ютеру, які саме кроки потрібно робити слідуйте при обчисленні формули з рекурсивним визначенням. Дайкстра майже напевно уявляв собі таку систему. Він тривалий час намагався відокремити реалізацію від семантики мови програмування. Потім знову його недетерміновані та багатопроцесорні мови програмування перебувають у лізі вище професійного програміста.
Зрештою, багато функцій просто простіші для розуміння, читання та запису в рекурсивній формі. Якщо немає вагомих причин, ви, ймовірно, не повинні (вручну) перетворювати ці функції в явно ітеративний алгоритм. Ваш комп’ютер буде правильно виконувати цю роботу.
Я бачу одну вагому причину. Припустимо, у вас є прототип системи на мові надвисокого рівня, як [ надягаючи азбестову білизну ] Схеми, Лісп, Хаскелл, OCaml, Perl або Паскаль. Припустимо, умови такі, що вам потрібна реалізація на C або Java. (Можливо, це політика.) Тоді ви, безумовно, можете мати деякі функції, написані рекурсивно, але які, в перекладі буквально, підірвали б вашу систему виконання. Наприклад, у схемі можлива нескінченна рекурсія хвоста, але та сама ідіома спричиняє проблеми для існуючих середовищ C. Іншим прикладом є використання лексично вкладених функцій та статичного діапазону, який Паскаль підтримує, але C - ні.
У цих умовах ви можете спробувати подолати політичний опір оригінальній мові. Можливо, вам здасться погано реалізовувати Лісп, як у десятому законі Грінспуна (язик у щоку). Або ви просто можете знайти зовсім інший підхід до рішення. Але в будь-якому випадку, безумовно, є спосіб.