Bisakah Anda selalu mengubah fungsi rekursif menjadi fungsi berulang? Ya, tentu saja, dan tesis Gereja-Turing membuktikannya jika ingatanku bermanfaat. Dalam istilah awam, ini menyatakan bahwa apa yang dapat dihitung dengan fungsi rekursif dapat dihitung dengan model iteratif (seperti mesin Turing) dan sebaliknya. Tesis ini tidak memberi tahu Anda dengan tepat bagaimana melakukan konversi, tetapi ia mengatakan bahwa itu pasti mungkin.
Dalam banyak kasus, mengonversi fungsi rekursif itu mudah. Knuth menawarkan beberapa teknik dalam "The Art of Computer Programming". Dan seringkali, sesuatu yang dihitung secara rekursif dapat dihitung dengan pendekatan yang sama sekali berbeda dalam waktu dan ruang yang lebih sedikit. Contoh klasik dari ini adalah angka Fibonacci atau urutannya. Anda pasti telah menemui masalah ini dalam rencana gelar Anda.
Di sisi lain dari koin ini, kita tentu bisa membayangkan sistem pemrograman yang begitu canggih sehingga memperlakukan definisi rumus dari rekursif sebagai undangan untuk memoize hasil sebelumnya, sehingga menawarkan manfaat kecepatan tanpa kerumitan memberi tahu komputer secara tepat langkah mana yang harus dilakukan. ikuti perhitungan formula dengan definisi rekursif. Dijkstra hampir pasti membayangkan sistem seperti itu. Dia menghabiskan waktu lama mencoba memisahkan implementasi dari semantik bahasa pemrograman. Kemudian lagi, bahasa pemrograman non-deterministik dan multi-pemrosesan berada di liga di atas programmer profesional berlatih.
Dalam analisis akhir, banyak fungsi yang lebih mudah dimengerti, dibaca, dan ditulis dalam bentuk rekursif. Kecuali jika ada alasan kuat, Anda mungkin seharusnya tidak (secara manual) mengonversi fungsi-fungsi ini ke algoritma iteratif yang eksplisit. Komputer Anda akan menangani pekerjaan itu dengan benar.
Saya bisa melihat satu alasan kuat. Misalkan Anda memiliki sistem prototipe dalam bahasa tingkat super tinggi seperti Skema [ mengenakan pakaian asbes ], Lisp, Haskell, OCaml, Perl, atau Pascal. Misalkan kondisinya sedemikian rupa sehingga Anda memerlukan implementasi di C atau Java. (Mungkin itu politik.) Maka Anda tentu bisa memiliki beberapa fungsi yang ditulis secara rekursif tetapi yang, diterjemahkan secara harfiah, akan meledak sistem runtime Anda. Sebagai contoh, rekursi ekor tak terbatas dimungkinkan dalam Skema, tetapi idiom yang sama menyebabkan masalah bagi lingkungan C yang ada. Contoh lain adalah penggunaan fungsi bersarang secara leksikal dan ruang lingkup statis, yang didukung Pascal tetapi C tidak.
Dalam keadaan ini, Anda mungkin mencoba mengatasi perlawanan politik terhadap bahasa asli. Anda mungkin menemukan diri Anda menerapkan Lisp dengan buruk, seperti dalam hukum kesepuluh (lidah-di-pipi) Greenspun. Atau Anda mungkin hanya menemukan pendekatan yang sama sekali berbeda untuk solusi. Tapi bagaimanapun juga, pasti ada jalan.