Sezgisel cevap, sınırsız döngüleriniz yoksa ve özyinelemeniz yoksa ve gitmediyseniz, programlarınızın sonlandırılmasıdır. Bu tam olarak doğru değil, fesih yapmamak için başka yollar da var, ancak çoğu pratik vaka için yeterince iyi. Elbette bunun tersi yanlış, bu yapılarda sonlandırılmamış programlara izin vermeyen diller var, ancak sofistike tip sistemler gibi diğer kısıtlamaları kullanıyorlar.
özyineleme
Komut dosyası dillerinde sık karşılaşılan bir kısıtlama, özyinelemeyi dinamik olarak önlemektir: A çağrıları B çağrıları C çağrıları… çağırırsa, A çağrıları yaparsa, yorumlayıcı (veya sizin durumunuzda denetleyici), özyineleme gerçekten sonlanabilse bile bir hata verir veya sinyal verir. İki somut örnek:
C önişlemcisi, bir makroyu genişletirken bir makroyu olduğu gibi bırakır. En yaygın kullanım, bir işlevin etrafına sarıcı tanımlamaktır:
#define f(x) (printf("calling f(%d)\n", (x)), f(x))
f(3);
Bu,
(printf("calling f(%d)\n", (3)), f(3))
Karşılıklı özyineleme de ele alınır. Bunun bir sonucu, C ön işlemcisinin her zaman sonlandırılmasıdır, ancak yüksek çalışma zamanı karmaşıklığına sahip makrolar oluşturmak mümkündür.
#define f0(x) x(x)x(x)
#define f1(x) f0(f0(x))
#define f2(x) f1(f1(x))
#define f3(x) f2(f2(x))
f3(x)
Unix kabukları takma adları yinelemeli olarak genişletir, ancak yalnızca zaten genişletilmiş bir takma adla karşılaşana kadar. Yine, birincil amaç benzer şekilde adlandırılmış bir komut için bir takma ad tanımlamaktır.
alias ls='ls --color'
alias ll='ls -l'
nn
Özyinelemeli çağrıların sona erdiğini kanıtlamak için, bir özyinelemeli çağrıdan diğerine her zaman azalan bir pozitif tamsayı bulmak gibi daha genel teknikler vardır, ancak bunların tespit edilmesi oldukça zordur. Çıkarmak yerine, çoğu zaman doğrulamak zordur.
döngüler
for
mn
Özellikle, döngüler için (artı koşullu gibi makul dil yapıları), tüm ilkel özyinelemeli işlevleri yazabilir veya tersini yapabilirsiniz. İlkel özyinelemeli işlevleri sözdizimsel olarak tanıyabilirsiniz (belirsiz bir şekilde yazıldıysa), çünkü while while döngüsü veya goto veya özyineleme veya başka bir hile kullanmazlar. İlkel özyinelemeli işlevlerin sona erdirilmesi garanti edilir ve çoğu pratik görev ilkel özyinelemenin ötesine geçmez.