Her zaman yinelemeli bir işlevi yinelemeli bir işleve dönüştürebilir misiniz? Evet, kesinlikle, ve Church-Turing tezi, hafızanın işe yarayıp yaramadığını kanıtlıyor. Meslekten olmayan terimlerle, özyinelemeli işlevlerle hesaplanabilen şeyin yinelemeli bir modelle (Turing makinesi gibi) hesaplanabileceğini ve tersini belirtir. Tez size tam olarak dönüşümün nasıl yapılacağını söylemiyor, ancak bunun kesinlikle mümkün olduğunu söylüyor.
Çoğu durumda, özyinelemeli bir işlevi dönüştürmek kolaydır. Knuth "Bilgisayar Programlama Sanatı" nda çeşitli teknikler sunmaktadır. Ve sıklıkla, özyinelemeli olarak hesaplanan bir şey, daha az zaman ve mekanda tamamen farklı bir yaklaşımla hesaplanabilir. Bunun klasik örneği Fibonacci sayıları veya bunların dizileridir. Bu problemi kesinlikle derece planınızda karşıladınız.
Bu madalyonun kapak tarafında, bir formülün özyinelemeli bir tanımını, önceki sonuçları hatırlamak için bir davet olarak ele alacak kadar gelişmiş bir programlama sistemi hayal edebiliriz, böylece bilgisayara tam olarak hangi adımları atma zorluğu olmadan hız avantajı sunarız özyinelemeli bir tanım ile bir formülün hesaplanmasını takip edin. Dijkstra neredeyse böyle bir sistem hayal etti. Uygulamayı bir programlama dilinin anlambiliminden ayırmaya çalışmak için uzun zaman harcadı. Daha sonra, deterministik olmayan ve çok işlemcili programlama dilleri, pratik profesyonel programcının üstünde bir ligde.
Son analizde, birçok fonksiyonun özyinelemeli biçimde anlaşılması, okunması ve yazılması daha kolaydır. Zorlayıcı bir neden olmadıkça, muhtemelen bu işlevleri açık bir şekilde yinelemeli algoritmaya dönüştürmemelisiniz. Bilgisayarınız bu işi doğru bir şekilde gerçekleştirecektir.
Zorlayıcı bir neden görüyorum. [ Asbest iç çamaşırı giymek ] Şeması, Lisp, Haskell, OCaml, Perl veya Pascal gibi süper yüksek bir dilde bir prototip sisteminiz olduğunu varsayalım . Koşulların C veya Java'da bir uygulamaya ihtiyacınız olduğunu varsayalım. (Belki de siyasettir.) O zaman tekrar tekrar yazılan ancak kelimenin tam anlamıyla tercüme edilen, çalışma zamanı sisteminizi patlatacak bazı işlevleriniz olabilir. Örneğin, Şema'da sonsuz kuyruk yinelemesi mümkündür, ancak aynı deyim mevcut C ortamları için bir soruna neden olur. Başka bir örnek, Pascal'ın desteklediği, ancak C'nin desteklemediği, sözcüksel olarak iç içe geçmiş işlevlerin ve statik kapsamın kullanılmasıdır.
Bu durumlarda, orijinal dile karşı politik direnişin üstesinden gelmeye çalışabilirsiniz. Greenspun'un (yanaktaki dil) onuncu yasasında olduğu gibi, Lisp'i kötü bir şekilde yeniden uygularken bulabilirsiniz. Veya çözüm için tamamen farklı bir yaklaşım bulabilirsiniz. Ancak her durumda, kesinlikle bir yol var.