2015-06-09 5 views
6

Supose sizin gibi bir özyinelemeli fonksiyon var? Yazılmıyorsa öyle yazılabilir mi?Bu bir kuyruk araması mı?</p> <pre><code>Blah.prototype.add = function(n) { this.total += n; this.children.forEach(function(child) { child.add(n); }); }; </code></pre> <p><code>child.add()</code> bir kuyruk çağrı mı: (JavaScript)

function(child) { 
    child.add(n); 
//^tail 
} 

:

+0

Bunu söyleyebilirim. Bir döngü içinde olmasına rağmen, hala gerçekleştirilmekte olan son eylemdir. – Brennan

+0

Emin değilim ... Geleneksel ('i = 0; i pixelmike

+0

JS'de muhtemelen bir 'kuyruk çağrısı', inFitr işlevinin çöp toplanmasını da sağlayan 'someFn()' i döndürmesini sağlar. –

cevap

1

Evet olurdu, bir kuyruk çağrıdır Yine de burada hiçbir şey kuyruğudur, çünkü doğrudan özyinelemeli bir çağrı değildir.

Ayrıca this.children.forEach(…), add yönteminde bir kuyruk çağrıdır. Ancak, geri çağırma işleminin yerel forEach yönteminde çağrılması, büyük olasılıkla arka arkaya optimize edilmemiştir (ve sonuncusu hariç olmak üzere). değil aynı zamanda return sonuçlarını yaparsanız bu kuyruk aramaların hiçbiri optimize edileceğini

Blah.prototype.add = function(n) { 
    "use strict"; 
    this.total += n; 
    let l = this.children.length; 
    if (!l--) 
     return; 
    for (let i=0; i<l; i++) 
     this.children[i].add(n); 
    this.children[i].add(n); // tail-recursion 
}; 

Bildirimi için işlevini yeniden yazarak onu zorlayabilir.

+0

'Add''in kuyruk özyineli olduğundan emin misiniz? Basit bir döngü yapısı kullanılsa bile, gerçekleştirilen en son işlem döngü koşullu denetimi olur, dolayısıyla kuyruk özyinelemeli olmaz, değil mi?Özyinelemeli aramanın, bir algoritmanın kuyruk özyinelemesine yönelik en son yürütülen ifadesi olması gerektiğini düşündüm. – plalx

+0

@ plalx: Ben 'add' kuyruğunun özyinelemedim demedim. Eğer hiçbir şey 'forEach' ve onun geri dönüşü ile karşılıklı olarak tekrarlayıcı olduysa - kendini çağırmaz. Sadece 'add' bir kuyruk araması içerdiğini söyledim. – Bergi

+0

Teşekkürler, evet ben child.add addEn işlevi için değil, her geri çağrısı için bir kuyruk çağrısı olup olmadığını soruyordum açık olmalıydı. – pixelmike

1
+0

Evet, optimizasyonun henüz yerinde olduğunu düşünmedim, ama ne zaman olduğu için hazırlanmaya çalışıyorum. Linkler için teşekkürler. – pixelmike

+0

Bağlandığınız bu soru güncel değil. ES6 uygun kuyruk arama optimizasyonuna sahip. – Bergi

+0

Yanılıyorsam düzeltin ama ES6 henüz çalışmıyor mu? – exussum

İlgili konular