Рекурсію можна замінити ітерацією плюс необмеженою пам'яттю .
Якщо у вас є лише ітерація (скажімо, під час циклів) і обмежений об'єм пам'яті, то все, що у вас є, - це кінцевий автомат. Маючи обмежений об'єм пам'яті, обчислення мають обмежену кількість можливих кроків, тому можливо їх моделювання за допомогою кінцевого автомата.
Безмежна пам'ять змінює угоду. Ця необмежена пам'ять може приймати безліч форм, які, як виявляється, мають рівноцінну виразну силу. Наприклад, машина Тьюрінга робить це простим: є одна стрічка, і комп'ютер може рухатись по стрічці лише вперед або назад за крок за часом, але цього достатньо, щоб зробити все, що можна зробити з рекурсивними функціями.
Машина Тьюрінга може розглядатися як ідеалізована модель комп'ютера (машина з кінцевим станом) з деяким додатковим сховищем, яке зростає на вимогу. Зауважте, що важливо, що не тільки не існує обмеженого обмеження на стрічці, але навіть з огляду на введення, ви не можете надійно передбачити, скільки стрічки знадобиться. Якщо ви могли б передбачити (тобто обчислити) скільки стрічки потрібно від введення, то ви могли б вирішити, чи буде обчислення зупинено, обчисливши максимальний розмір стрічки, а потім обробити всю систему, включаючи теперішню кінцеву стрічку, як машину з кінцевим станом .
Ще один спосіб моделювання машини Тьюрінга з комп’ютерами полягає в наступному. Моделюйте машину Тьюрінга за допомогою комп’ютерної програми, яка зберігає початок стрічки в пам'яті. Якщо обчислення доходить до кінця частини стрічки, яка вписується в пам’ять, замініть комп'ютер на більший комп'ютер і запустіть обчислення ще раз.
Тепер припустимо, що ви хочете імітувати рекурсивні обчислення за допомогою комп'ютера. Прийоми виконання рекурсивних функцій добре відомі: кожен виклик функції має частину пам'яті, яку називають фреймом стека . Принципово важливо, що рекурсивні функції можуть поширювати інформацію через кілька викликів, передаючи змінні навколо. З точкою зору реалізації на комп'ютері, це означає , що виклик функції може отримати доступ до стека кадру з (внучатого) * батьківським виклику.
Комп'ютер - це процесор - машина з кінцевим станом (з величезною кількістю станів, але ми тут робимо теорію обчислень, тому все важливо лише в тому, що це скінченно) - в поєднанні з кінцевою пам'яттю. Мікропроцесор виконує один гігантський цикл: "поки живлення ввімкнено, прочитайте інструкцію з пам'яті та виконайте її". (Реальні процесори набагато складніші за це, але це не впливає на те, що вони можуть обчислити, лише наскільки швидко і зручно це зробити.) Комп'ютер може виконувати рекурсивні функції лише цим циклом, щоб забезпечити ітерацію, плюс механізм для доступ до пам'яті, включаючи можливість збільшення розміру пам'яті за бажанням.
Якщо ви обмежите рекурсію примітивною рекурсією, то ви можете обмежити ітерацію обмеженою ітерацією. Тобто замість використання циклів у той час як з непередбачуваним часом виконання, ви можете використовувати для циклів, де кількість ітерацій відомо на початку циклу¹. Кількість ітерацій може бути невідома на початку програми: вона сама може бути обчислена попередніми циклами.
Я не збираюся навіть ескізувати доказ тут, але існує інтуїтивно зрозумілий зв'язок між переходом від примітивної рекурсії до повної рекурсії і переходом від циклів до циклів циклу: в обох випадках це передбачає не знати заздалегідь, коли ви Стоп. При повній рекурсії це робиться з оператором мінімізації, де ви продовжуєте роботу, поки не знайдете параметр, який задовольняє умові. З циклами while, це робиться, продовжуючи, поки не буде виконано стан циклу.
for
while
n