Genel bir bilgisayarın minimum işlemlerini sıfırdan oluşturursanız, "Yineleme" önce bir yapı taşı olarak gelir ve "özyineleme" den daha az kaynak yoğundur, ergo daha hızlıdır.
Sıfırdan başlayıp temelde temel, temel kavramları tanımlayarak kavramlardan oluşan bir hiyerarşi oluşturacağız, sonra bunlarla ikinci seviye kavramlar oluşturacağız vb.
İlk Konsept: Bellek hücreleri, depolama, Durum . Bir şey yapmak için nihai ve ara sonuç değerlerini saklayabileceğiniz yerlere ihtiyacınız vardır . Diyelim ki Memory , M [0..Infinite] adlı sonsuz bir "tamsayı" hücre dizimiz var.
Talimatlar: bir şeyler yapın - bir hücreyi dönüştürün, değerini değiştirin. durumu değiştir . Her ilginç talimat bir dönüşüm gerçekleştirir. Temel talimatlar:
a) Bellek hücrelerini ayarlama ve taşıma
- hafızaya bir değer kaydetme, örneğin: 5 m kaydetme [4]
- bir değeri başka bir konuma kopyalayın: örneğin: store m [4] m [8]
b) Mantık ve aritmetik
- ve, veya xor, değil
- add, sub, mul, div. örneğin m [7] m [8] ekleyin
Bir Yürütücü Ajan : Modern bir CPU'nun çekirdeği . "Aracı", talimatları yürütebilecek bir şeydir. Bir Ajan aynı zamanda kağıt üzerindeki algoritmayı takip eden bir kişi olabilir.
Adım sırası: bir talimatlar dizisi : yani: önce yapın, sonra yapın, vb. Zorunlu bir talimatlar dizisi. Bir satır ifadesi bile "zorunlu talimat dizisidir". Belirli bir "değerlendirme sırasına" sahip bir ifadeniz varsa adımlarınız vardır . Bu, tek bir bestelenmiş ifadenin bile örtük “adımlara” ve ayrıca örtük bir yerel değişkene sahip olduğu anlamına gelir (buna “sonuç” diyelim). Örneğin:
4 + 3 * 2 - 5
(- (+ (* 3 2) 4 ) 5)
(sub (add (mul 3 2) 4 ) 5)
Yukarıdaki ifade, örtük bir "sonuç" değişkeniyle 3 adım anlamına gelir.
// pseudocode
1. result = (mul 3 2)
2. result = (add 4 result)
3. result = (sub result 5)
Dolayısıyla, belirli bir değerlendirme sırasına sahip olduğunuzdan, ifadeler bile, zorunlu bir talimat dizisidir . İfade , belirli bir sırayla yapılacak bir dizi işlem anlamına gelir ve adımlar olduğundan, örtük bir "sonuç" ara değişkeni de vardır.
Yönerge İşaretçisi : Bir dizi adımınız varsa, örtük bir "yönerge işaretçisi" de vardır. Talimat işaretçisi bir sonraki talimatı işaretler ve talimat okunduktan sonra ancak talimat yürütülmeden önce ilerler.
Bu sahte bilgisayar makinesinde, Yönerge İşaretçisi Belleğin bir parçasıdır . (Not: Normalde Yönerge İşaretçisi CPU çekirdeğinde “özel kayıt” olacaktır, ancak burada kavramları basitleştireceğiz ve tüm verilerin (kayıtlar dahil) “Hafıza” nın bir parçası olduğunu varsayacağız)
Atla - Sıralı sayıda adımınız ve bir Talimat İşaretçisi varsa , Talimat İşaretçisinin değerini değiştirmek için " mağaza " talimatını uygulayabilirsiniz . Mağaza talimatının bu özel kullanımını yeni bir adla adlandıracağız: Jump . Yeni bir isim kullanıyoruz çünkü yeni bir kavram olarak düşünmek daha kolay. Talimat işaretçisini değiştirerek aracıya “adım x'e git” talimatını veriyoruz.
Sonsuz Yineleme : Geriye atlayarak , ajanın belirli sayıda adımı "tekrar etmesini" sağlayabilirsiniz. Bu noktada sonsuz İterasyonumuz var.
1. mov 1000 m[30]
2. sub m[30] 1
3. jmp-to 2 // infinite loop
Koşullu - Talimatların koşullu yürütülmesi. "Koşullu" yan tümcesinde, geçerli duruma bağlı olarak (önceki bir talimatla ayarlanabilir) birkaç komuttan birini koşullu olarak yürütebilirsiniz.
Doğru İterasyon : Şimdi şartlı madde ile geri atlama talimatının sonsuz döngüsünden kaçabiliriz . Şimdi koşullu bir döngüye sahibiz ve sonra uygun yineleme
1. mov 1000 m[30]
2. sub m[30] 1
3. (if not-zero) jump 2 // jump only if the previous
// sub instruction did not result in 0
// this loop will be repeated 1000 times
// here we have proper ***iteration***, a conditional loop.
Adlandırma : veri tutan veya bir adım tutan belirli bir bellek konumuna ad vermek . Bu sadece bir "kolaylık" olması. Bellek konumları için “adlar” tanımlama kapasitesine sahip olarak yeni talimatlar eklemiyoruz. “Adlandırma” ajan için bir talimat değil, sadece bizim için bir kolaylık. Adlandırma , kodu (bu noktada) okumayı ve değiştirmeyi kolaylaştırır.
#define counter m[30] // name a memory location
mov 1000 counter
loop: // name a instruction pointer location
sub counter 1
(if not-zero) jmp-to loop
Tek düzey alt program : Sıklıkla yürütmeniz gereken bir dizi adım olduğunu varsayalım. Adımları bellekte adlandırılmış bir konumda saklayabilir ve yürütmeniz gerektiğinde bu konuma atlayabilirsiniz (çağrı). Dizinin sonunda, yürütmeye devam etmek için arama noktasına geri dönmeniz gerekir . Bu mekanizma ile temel talimatları oluşturarak yeni talimatlar (altyordamlar) oluşturuyorsunuz.
Uygulama: (yeni konsept gerekmez)
- Geçerli Yönerge İşaretçisini önceden tanımlanmış bir bellek konumunda saklayın
- altyordamına atla
- altyordamın sonunda, Yönerge İşaretçisini önceden tanımlanmış bellek konumundan alır ve orijinal aramanın aşağıdaki komutuna etkili bir şekilde geri dönersiniz
İlgili sorun tek seviyeli uygulaması: Bir sabrutinden başka alt yordamı çağırmak olamaz. Bunu yaparsanız, dönen adresin üzerine yazılır (global değişken), böylece aramaları iç içe geçiremezsiniz.
Altyordamlar için daha iyi bir Uygulamaya sahip olmak için: Bir STACK'a ihtiyacınız var
Yığın : Hafıza alanını bir "yığın" olarak çalışmak üzere tanımlarsınız, yığındaki değerleri "itebilir" ve aynı zamanda son "itilen" değeri "patlatabilirsiniz". Bir yığını uygulamak için, yığının gerçek “başını” gösteren bir Yığın İşaretçisi (Talimat İşaretçisi'ne benzer) gerekir . Bir değeri “ittiğiniz” zaman, yığın işaretçisi azalır ve değeri saklarsınız. “Açtığınızda”, değeri gerçek Yığın İşaretçisi'nde alırsınız ve ardından Yığın İşaretçisi artırılır.
Altyordamlar Şimdi bir olduğunu yığını biz doğru altyordamlarını uygulayabilir iç içe çağrılar oluşturulması . Uygulama benzerdir, ancak Yönerge İşaretçisini önceden tanımlanmış bir bellek konumunda saklamak yerine, yığındaki IP değerini "iter" . Altyordamın sonunda, sadece yığındaki değeri “pop” hale getiriyoruz ve orijinal çağrıdan sonra talimatlara etkili bir şekilde geri dönüyoruz . Bir "yığın" a sahip olan bu uygulama, başka bir altyordamdan altyordam çağrılmasına izin verir. Bu uygulama ile , temel talimatları veya diğer altyordamları yapı taşları olarak kullanarak yeni talimatları altyordam olarak tanımlarken çeşitli soyutlamalar oluşturabiliriz .
Özyineleme : Bir altyordam kendini çağırdığında ne olur? Buna "özyineleme" denir.
Sorun: Yerel ara sonuçların üzerine yazmak, bir alt yordamın belleğe depolayabiliyor olması. Aradığınız yana /, aynı adımları yeniden eğer ara sonuç önceden tanımlanmış hafıza konumları (küresel değişkenler) saklanır onlar iç içe çağrılarda üzerine yazılır olacaktır.
Çözüm: tekrarlama, alt programlar yerel ara sonuçları depolamak gerektiği izin vermek için yığın içinde her biri üzerinde, bu nedenle, yinelemeli çağrı ara sonuçlar, farklı bellek konumlarında saklanır (doğrudan veya dolaylı olarak).
...
Son olarak, özyineleme kullanmak için birçok fırsatınız olduğunu unutmayın. Her yerde Özyinelemeli Veri Yapılarınız var, şimdi bir tanesine bakıyorsunuz: DOM'un okuduklarınızı destekleyen kısımları bir RDS, bir JSON ifadesi bir RDS, bilgisayarınızdaki hiyerarşik dosya sistemi bir RDS, yani: dosyalar ve dizinler içeren bir kök dizin, dosyalar ve dizinler içeren her dizin, dosyalar ve dizinler içeren dizinlerin her biri ...