SORU
6 AĞUSTOS 2008, ÇARŞAMBA


Özyineleme nedir ve ne zaman kullanmalıyım?

Düzenli olarak e-posta listeleri ve çevrimiçi tartışmalar üzerine gelmek gibi görünüyor konulardan birini yararları (veya bunların eksikliği) bir Bilgisayar Bilimleri Derece yapıyor. Olumsuz taraf için zaman ve tekrar gelmek gibi görünüyor bir argüman yıl sayısı için kodlama ve asla özyineleme kullandık.

Şimdi soru şu:

  1. Özyineleme nedir?
  2. Ne zaman özyineleme kullanır mıydım?
  3. Neden insanlar özyineleme kullanmak değil mi?

CEVAP
6 AĞUSTOS 2008, ÇARŞAMBA


Bu konu recursion iyi bir takım açıklamalar var, bu cevap çoğu dilde kullanmamalısın neden olur*. Büyük zorunlu dil uygulamalarının çoğu (C, C , Basic, Python, Ruby,Java, ve C her önemli uygulama yani#) iteration özyineleme için oldukça fazla tercih edilir.

Neden görmek için, yukarıdaki dillerden bir işlev çağrısı için kullandığınız adım yürümek:

  1. uzay işlevin bağımsız değişkenleri ve yerel değişkenler için the stack üzerinde oyulmuş.
    • bir işlevin bağımsız değişken bu yeni alana kopyalanır
    • kontrol işlevi atlar
    • işlevin kodu çalıştırır
    • işlevin sonucu bir dönüş değeri kopyalanır
    • yığın eski yerine geri sarılır
    • kontrolü geri işlevi çağrıldı atlar

Tüm bu adımları yapmak zaman, genellikle biraz bir döngü içinde yineleme için gereken daha fazla zaman alır. Ancak, gerçek sorun, Adım #1. Birçok programları başlatmak, ayrılamadı bir tek yığın bellek için kendi yığın, ve ne zaman kalmamış bellek (genellikle, ama her zaman nedeniyle özyineleme), program çöker nedeniyle bir stack overflow.

Bu dillerde özyineleme yavaş ve çökmesini karşı savunmasız hale getiriyor. Yine de bunu kullanmak için bazı tartışmalar var. Genel olarak, özyinelemeli olarak yazılmış kod daha kısa ve biraz daha şık, okumayı öğrendikten sonra.

Dil uygulayıcıları tail call optimization adlı kullanabileceğiniz yığın taşması bazı sınıfları yok eden bir tekniktir. Kısa ve öz: eğer bir işlevin dönüş ifadesidir sadece sonucu bir işlev çağrısı, o zaman hiç gerek yok Ekle yeni bir seviye üzerine yığını, yeniden geçerli bir fonksiyon olmak denir. Ne yazık ki, birkaç zorunlu dil uygulamaları tail call optimizasyonu var yerleşik.

*Özyineleme seviyorum. My favorite static language döngüler, özyineleme bir şeyi tekrar tekrar yapmak için tek yoldur kullanmaz. Ben sadece özyineleme genellikle bunun için ayarlı değil o dilde iyi bir fikir olduğunu sanmıyorum.

Tipik ismi ** bu arada Mario, "" eğer seçtiğiniz dil zaten uygulaması yok ise, şaşarım. birleşim

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ShoSho

    ShoSho

    20 Ocak 2010
  • UKF

    UKF

    2 Aralık 2009
  • Vladimir Jenko

    Vladimir Jen

    1 Mart 2010