Bạn có thể luôn luôn biến một hàm đệ quy thành một hàm lặp không? Vâng, hoàn toàn, và luận điểm Church-Turing chứng minh điều đó nếu bộ nhớ phục vụ. Nói một cách dễ hiểu, nó nói rằng những gì có thể tính toán được bằng các hàm đệ quy có thể tính toán được bằng một mô hình lặp (như máy Turing) và ngược lại. Luận án không cho bạn biết chính xác cách thực hiện chuyển đổi, nhưng nó nói rằng nó chắc chắn có thể.
Trong nhiều trường hợp, chuyển đổi một hàm đệ quy là dễ dàng. Knuth cung cấp một số kỹ thuật trong "Nghệ thuật lập trình máy tính". Và thông thường, một thứ được tính toán đệ quy có thể được tính bằng một cách tiếp cận hoàn toàn khác trong ít thời gian và không gian hơn. Ví dụ kinh điển về điều này là các số Fibonacci hoặc các chuỗi của chúng. Bạn chắc chắn đã gặp vấn đề này trong kế hoạch bằng cấp của bạn.
Mặt trái của đồng tiền này, chúng ta chắc chắn có thể tưởng tượng một hệ thống lập trình tiên tiến đến mức coi định nghĩa đệ quy của công thức như một lời mời để ghi nhớ các kết quả trước đó, do đó mang lại lợi ích tốc độ mà không gặp rắc rối khi nói với máy tính chính xác các bước theo dõi tính toán của một công thức với định nghĩa đệ quy. Dijkstra gần như chắc chắn đã tưởng tượng một hệ thống như vậy. Ông đã dành một thời gian dài để cố gắng tách việc thực hiện khỏi ngữ nghĩa của một ngôn ngữ lập trình. Sau đó, một lần nữa, ngôn ngữ lập trình không xác định và đa xử lý của anh ta nằm trong một giải đấu trên các lập trình viên chuyên nghiệp thực hành.
Trong phân tích cuối cùng, nhiều hàm chỉ đơn giản là dễ hiểu, đọc và viết ở dạng đệ quy. Trừ khi có một lý do thuyết phục, có lẽ bạn không nên (thủ công) chuyển đổi các hàm này thành một thuật toán lặp rõ ràng. Máy tính của bạn sẽ xử lý công việc đó một cách chính xác.
Tôi có thể thấy một lý do thuyết phục. Giả sử bạn có một hệ thống nguyên mẫu bằng ngôn ngữ siêu cao cấp như [ tặng đồ lót amiăng ] Scheme, Lisp, Haskell, OCaml, Perl hoặc Pascal. Giả sử các điều kiện sao cho bạn cần triển khai bằng C hoặc Java. (Có lẽ đó là chính trị.) Sau đó, bạn chắc chắn có thể có một số chức năng được viết đệ quy nhưng được dịch theo nghĩa đen sẽ làm nổ tung hệ thống thời gian chạy của bạn. Ví dụ, đệ quy đuôi vô hạn có thể có trong Lược đồ, nhưng thành ngữ tương tự gây ra vấn đề cho các môi trường C hiện có. Một ví dụ khác là việc sử dụng các hàm lồng nhau và phạm vi tĩnh, mà Pascal hỗ trợ nhưng C thì không.
Trong những trường hợp này, bạn có thể cố gắng vượt qua sự kháng cự chính trị với ngôn ngữ gốc. Bạn có thể thấy mình đang thực hiện lại Lisp một cách tồi tệ, như trong luật thứ mười (nói bằng lưỡi) của Greensasta. Hoặc bạn có thể tìm thấy một cách tiếp cận hoàn toàn khác với giải pháp. Nhưng trong bất kỳ sự kiện, chắc chắn có một cách.