2011-11-11 12 views
6

Scala'da özyinelemeli döngüler yazmak için daha iyi bir yol olup olmadığını merak ediyordum.Scala'da yinelemeli döngüler nasıl yapılır

def fib(n: Int) = { 
    def loop(a: BigInt = 0, b: BigInt = 1, n: Int = n): BigInt = { 
    if(n==0) a 
    else loop(b, a+b, n-1) 
    } 
    loop() 
} 

Ben a ve b maruz olacağını o zaman bu

def fib(n: Int, a: BigInt = 0, b: BigInt = 1): BigInt = { 
    if(n==0) a 
    else fib(n-1, b, a+b) 
} 

ama böyle yazmak ve artık yöntemi içinde kapsüllü olamazdı.

+0

Bu nasıl yapıldığı oldukça fazladır (ilk örnek). İçteki 'def' ayrıca özel olmasını sağlar ve kuyruk kuyrukları için optimize edilebilir. – huynhjl

+0

İkinci versiyon da kuyruk özlemi. Bu parametreleri Ağustos ayında Scala Language mail listesinden özel kılmak için bir yol eklemenin imkanını sordum ve sağır edici bir sessizlik/ilgisizlik ile karşılandı. http://www.scala-lang.org/node/10736 –

+0

Kısa cevap: Hayır. –

cevap

3

Not:

def fib(n: Int) = (1 to n).foldLeft((BigInt(0),BigInt(1)))((p,_)=>(p._2,p._1+p._2))._1 

diğer yaklaşım, bir yineleyici tabanlı çözüm olacaktır

[Düzenle]:

def fib = Iterator.iterate((0,1)){case (x,y) => (y,x+y)}.map(_._1) 

Bu sonsuz miktarda fibonacci sayı üretir, ancak istediğiniz kadar çok şey alabilirsiniz. ör. fib.take(10).toList

1

Döngülerin kendi alanları vardır. Yinelemeli bir işlevi olan bir döngü değiştirdiğinizde, açık bir kapsam oluşturmaya zorlanırsınız (içsel yöntem). Etrafında hiçbir yolu yoktur. Bu böyle yapılır. Bunun hakkında yanlış bir şey yok. genellikle bu tür durumlarda foldLeft veya foldRight kullanabilirsiniz