2011-11-11 12 views
6

मैं सोच रहा था कि स्केल में रिकर्सिव लूप लिखने का बेहतर तरीका है या नहीं।स्कैला में रिकर्सिव लूप कैसे करें

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() 
} 

मैं इसे इस

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

लेकिन फिर प्रकार लिख सकते हैं ए और बी उजागर किया जाएगा और विधि के अंदर अब और समझाया नहीं।

+0

यह काफी है कि यह कैसे किया जाता है (पहला उदाहरण)। आंतरिक 'डीफ़' यह भी सुनिश्चित करता है कि यह निजी है और पूंछ के पूंछ के लिए अनुकूलित किया जा सकता है। – huynhjl

+0

दूसरा संस्करण पूंछ रिकर्सिव भी है। मैंने अगस्त में स्कैला भाषा मेलिंग सूची के इन पैरामीटर को निजी बनाने के लिए कुछ रास्ता जोड़ने की संभावना के बारे में पूछा और ब्याज की मौन/ब्याज की कमी के साथ मुलाकात की। http://www.scala-lang.org/node/10736 –

+0

संक्षिप्त उत्तर: नहीं। –

उत्तर

3

नोट है कि आप अक्सर ऐसी स्थितियों में foldLeft या foldRight उपयोग कर सकते हैं:

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

[संपादित करें]

एक और दृष्टिकोण पुनरावर्तक आधारित समाधान होगा:

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

यह एक निश्चित मात्रा में फाइबोनैकी संख्या उत्पन्न करता है, लेकिन आप जितना चाहें उतना ले सकते हैं यह, उदा। fib.take(10).toList

1

लूप के पास अपने स्वयं के क्षेत्र हैं। जब आप एक लूप को एक रिकर्सिव फ़ंक्शन के साथ प्रतिस्थापित करते हैं तो आपको एक स्पष्ट दायरा (आंतरिक विधि) बनाने के लिए मजबूर किया जाता है। इसके आसपास कोई रास्ता नहीं है। इस तरह यह किया जाता है। इसके बारे में कुछ भी गलत नहीं है।

संबंधित मुद्दे