2014-10-31 17 views
10

Geri izleme ile özyineleme arasındaki fark nedir? Bu program nasıl çalışıyor?Geri izleme ve özyineleme arasındaki fark nedir?

void generate_all(int n) 
{ 
    if(n<1) printf("%s\n", ar); 
    else{ 
      ar[n-1]='0';  //fix (n)th bit as '0' 
      generate_all(n-1); //generate all combinations for other n-1 positions. 
      ar[n-1]='1';  //fix (n)th bit as '1' 
      generate_all(n-1); //generate all combinations for other n-1 positions. 
    } 
+1

Sanırım sorunuzu biraz daha netleştirmelisiniz. Sağladığınız kodda bile 'ar' tanımlanmamıştır. – Ashe

+0

harika bir soru! Gösterdiğiniz gibi, tüm olası sonuçların tam sayımı için uygulama mekanizması olarak hizmet eder; Sadece temel durumda yazdırmak yerine, bir test, testin ne zaman geçtiğine ilişkin koşullu bir yazdırma ve isteğe bağlı bir kurtarma işlemi eklediğinizde, kendinize özel bir probleme sahip olursunuz. –

cevap

8

Özyineleme bulunduğunuz aynı işlevin arama açıklanır. Bir özyinelemeli fonksiyonun tipik örneği

int fact(int n) { 
    int result; 
    if(n==1) return 1; 
    result = fact(n-1) * n; 
    return result; 
} 

gibi faktöryel, yani bir şey Burada gördüğünüz Gerçek şu ki olmasıdır kendini çağırır. Bu, özyineleme denen şeydir. Yinelemeyi durduran bir duruma her zaman gereksinim duyarsınız. Burada if(n==1) n her zaman her çağrıldığında (fact(n-1)) Geri Adım

azalacak gerçeği ile birleştirilir parametreleri verilen bir çözüm bulmak için çalışan bir algoritmadır. Çözüm için adaylar oluşturur ve şartları yerine getiremeyenleri terk eder. Çözülecek bir görev için tipik bir örnek, Eight Queens Puzzle olacaktır. Backtracking ayrıca, Neuronal Networks içinde yaygın olarak kullanılır.

açıkladığınız program yinelemeyi kullanır. Faktoriyel fonksiyona benzer şekilde, argüman 1 ile azalır ve eğer n < 1 ise sonlanır (çünkü geri kalanı yerine ar yazdıracaktır).

15

Bu soru, bir araba ile DeLorean arasındaki farkın ne olduğunu sormak gibidir.

Özyineleme işlevinde, temel duruma ulaşana kadar kendini çağırır.

Geri izlemede, problem için en iyi sonucu elde edene kadar tüm olasılıkları keşfetmek için özyinelemeyi kullanırsınız.

anlamak zor biraz olabilir, ben here bazı metin eklemek:

"Kavramsal olarak, bir ağacın köküne başlar; ağaç muhtemelen bazı iyi yaprakları ve bazı kötü yaprakları vardır, gerçi o olabilir yaprakların hepsi iyi ya da kötü olsun, iyi bir yaprak elde etmek istersiniz.Her düğümde, kökten başlayarak, çocuklarından birini hareket ettirirsiniz, ve siz bunu bir yaprak elde edene kadar tutarsınız.

Kötü bir yaprak aldığınızı varsayalım .. En son seçiminizi iptal ederek ve bu seçenekler kümesinde bir sonraki seçeneği deneyerek iyi bir yaprak aramaya devam etmek için geri dönebilirsiniz. choic'i iptal etmek Seni buraya getirdi ve o düğümde başka bir seçim yapmayı dene. Sen gittikten hiçbir seçeneklerle kökünde sonunda, bulunacak bir iyi yapraklar var."

Bu örnek gerekiyor.

enter image description here

kod Kişisel parçası size olarak, sadece özyineleme olduğunu Sonuç, hedefinize uymuyorsa asla geri dönme

1

Anlayışımda, geri izleme BFS ve DFS gibi diğer tüm algoritmalar gibi bir algoritmadır, ancak yineleme ve yineleme yöntemleri de vardır, daha yüksek algoritmalardan daha yüksek bir seviye, örneğin bir DFS'yi uygulamak için, oldukça sezgisel olan yinelemeyi kullanabilirsiniz. Ayrıca, yinelemeyi yığın ile de kullanabilir veya yinelemenin ve yinelemenin algoritmalarınızı desteklemenin sadece yöntemleri olduğunu düşünebilirsiniz.

İlgili konular