Scala'da backtracking
algoritması ile stream
tanımlamak için herhangi bir yolu var mı? Örneğin, aşağıdaki backtracking
algoritması, belirli bir boyuttaki tüm "ikili" dizeleri yazdırır.Geri izleme algoritması akışa nasıl dönüştürülür?
def binaries(s:String, n:Int) { if (s.size == n) println(s) else { binaries(s + '0', n) binaries(s + '1', n) } }
ben başka yinelemeli algoritması kullanarak belirli bir boyutta "ikili" dizeleri bir stream
tanımlayabilirsiniz inanıyoruz. Ancak yukarıdaki geri izleme algoritmasını yukarıdaki stream
'a dönüştürebilir miyim merak ediyorum.
Teşekkürler, tam olarak aradığım şey budur :) Orijinal geri izleme sürümüne göre daha verimli (yığın bellek tüketimi açısından) gibi görünüyor değil mi? – Michael
@Michael Belki de. "Stream" kullanarak kodun analiz verimliliğini çok rahat kullanmıyorum. Bunları kullanmak için gerekli bulursam, taşmadığından emin olmak için REPL üzerindeki kodu test ettiğinizden emin oluyorum. –
@Michael, akış sürümü yığın çerçeve kullanımı açısından daha az verimlidir. Her bir özyinelemeli arama, sürümünüzde yalnızca bir tanesine göre 4 adet yığın çerçevesi kullanır. Pratikte, bu örnek için bir sorun olmamalı. Yığın bellek kullanımıyla ilgili olarak, Aktarım sınıfı depolanan referans başına bellek kullanımı açısından en az etkili olan scala koleksiyonlarından biridir ancak kazara akıntının başına tutunmazsanız genellikle sorun yoktur. – huynhjl