Dimungkinkan untuk mengganti rekursi dengan iterasi plus memori tanpa batas .
Jika Anda hanya memiliki iterasi (katakanlah, sementara loop) dan jumlah memori yang terbatas, maka semua yang Anda miliki adalah otomat terbatas. Dengan jumlah memori yang terbatas, perhitungan memiliki sejumlah langkah yang mungkin terbatas, jadi dimungkinkan untuk mensimulasikan semuanya dengan otomat terbatas.
Memori yang tidak terbatas mengubah kesepakatan. Memori tanpa batas ini dapat mengambil banyak bentuk yang ternyata memiliki kekuatan ekspresif yang setara. Sebagai contoh, mesin Turing membuatnya tetap sederhana: ada satu kaset, dan komputer hanya dapat bergerak maju atau mundur pada kaset dengan satu langkah pada satu waktu - tetapi itu cukup untuk melakukan apa pun yang dapat Anda lakukan dengan fungsi rekursif.
Mesin Turing dapat dilihat sebagai model komputer yang diidealkan (finite state machine) dengan beberapa penyimpanan ekstra yang tumbuh sesuai permintaan. Perhatikan bahwa sangat penting bahwa tidak hanya tidak ada batasan pada pita, tetapi bahkan dengan input, Anda tidak dapat memprediksi dengan pasti berapa banyak pita yang akan dibutuhkan. Jika Anda dapat memprediksi (yaitu menghitung) berapa banyak pita yang dibutuhkan dari input, maka Anda dapat memutuskan apakah perhitungan akan berhenti dengan menghitung ukuran pita maksimum dan kemudian memperlakukan seluruh sistem, termasuk pita yang sekarang terbatas, sebagai mesin keadaan terbatas. .
Cara lain untuk mensimulasikan mesin Turing dengan komputer adalah sebagai berikut. Simulasikan mesin Turing dengan program komputer yang menyimpan awal kaset dalam memori. Jika perhitungan mencapai akhir bagian dari pita yang sesuai dengan memori, gantilah komputer dengan komputer yang lebih besar dan jalankan kembali perhitungan.
Sekarang anggaplah Anda ingin mensimulasikan perhitungan rekursif dengan komputer. Teknik-teknik untuk mengeksekusi fungsi rekursif sudah terkenal: setiap pemanggilan fungsi memiliki memori, yang disebut stack frame . Yang terpenting, fungsi rekursif dapat menyebarkan informasi melalui beberapa panggilan dengan mengirimkan variabel ke sekitarnya. Dalam hal implementasi pada komputer, itu berarti bahwa panggilan fungsi dapat mengakses frame stack panggilan induk (grand-) * .
Komputer adalah prosesor - mesin keadaan terbatas (dengan sejumlah besar keadaan, tapi kami sedang melakukan teori komputasi di sini, jadi yang penting adalah bahwa itu terbatas) - ditambah dengan memori terbatas. Mikroprosesor menjalankan satu raksasa sambil memutar: "saat daya menyala, baca instruksi dari memori dan jalankan". (Prosesor nyata jauh lebih kompleks dari itu, tetapi tidak mempengaruhi apa yang dapat mereka hitung, hanya seberapa cepat dan nyaman mereka melakukannya.) Komputer dapat menjalankan fungsi rekursif dengan hanya loop sementara ini untuk memberikan iterasi, ditambah mekanisme untuk mengakses memori, termasuk kemampuan untuk meningkatkan ukuran memori sesuka hati.
Jika Anda membatasi rekursi menjadi rekursi primitif, maka Anda dapat membatasi iterasi hingga iterasi terbatas . Artinya, alih-alih menggunakan loop sementara dengan waktu berjalan yang tidak dapat diprediksi, Anda dapat menggunakan untuk loop di mana jumlah iterasi diketahui di awal loop¹. Jumlah iterasi mungkin tidak diketahui pada awal program: iterasinya sendiri dapat dihitung dengan loop sebelumnya.
Saya bahkan tidak akan membuat sketsa bukti di sini, tetapi ada hubungan intuitif antara beralih dari rekursi primitif ke rekursi penuh, dan beralih dari loop ke loop sementara: dalam kedua kasus, itu melibatkan tidak mengetahui sebelumnya kapan Anda akan berhenti. Dengan rekursi penuh, ini dilakukan dengan operator minimisasi, di mana Anda terus berjalan sampai Anda menemukan parameter yang memenuhi syarat. Dengan while loop, ini dilakukan dengan terus berjalan sampai kondisi loop terpenuhi.
¹ loop dalam bahasa mirip C dapat melakukan iterasi tanpa batas sama seperti , hanya masalah konvensi untuk membatasi mereka untuk iterasi terbatas. Ketika orang berbicara tentang "untuk loop" dalam teori perhitungan, itu berarti hanya loop yang dihitung dari 1 ke n (atau setara). for
while
n