2015-11-12 12 views
6

मैं फक्शन बना रहा हूं जो तेजी से फैक्टोरियल की गणना करता है। इस21 की गणना कैसे करें! (21 फैक्टोरियल) तेजी से?

func factorial(factorialNumber: UInt64) -> UInt64 { 
    if factorialNumber == 0 { 
     return 1 
    } else { 
     return factorialNumber * factorial(factorialNumber - 1) 
    } 
} 

let x = factorial(20) 

की तरह इस fuction गणना कर सकते हैं तक 20.

मुझे लगता है कि भाज्य (21) मूल्य UINT64_MAX से भी बड़ा।

फिर 21 की गणना कैसे करें! (21 फैक्टोरियल) तेजी से?

+0

मुझे लगता है कि यह शुद्ध स्विफ्ट में संभव नहीं है। कम से कम तुच्छ नहीं। मुझे ऐसी कोई भाषा नहीं है जो बॉक्स के बाहर ऐसी संख्याओं की गणना कर सके। – dasdom

+0

मैंने इसे व्यक्तिगत रूप से उपयोग नहीं किया है, लेकिन आप लाइब्रेरी को आजमा सकते हैं जैसे https://github.com/kirsteins/BigInteger – Kevin

+0

यह बदसूरत हो सकता है, लेकिन यदि आप प्रत्येक पुनरावृत्ति के परिणाम को स्ट्रिंग में स्टोर करते हैं UIint, आप इसे कई में कर सकते हैं जैसे यह कागज में था। कुशल नहीं है, BigInteger लाइब्रेरी अधिक उपयोगी लगती है, लेकिन यह भी एक विकल्प है। –

उत्तर

3

असीमित 64 बिट पूर्णांक का अधिकतम मूल्य 18,446,744,073,709,551,615 है। 21 जबकि! = 51,0 9 0, 9 42,171,70 9, 440,000। इस तरह के मामले के लिए, आपको एक बड़े इंटीजर प्रकार की आवश्यकता है। मुझे स्विफ्ट में बिग इंटीजर के बारे में एक सवाल मिला। उस लिंक में बिग इंटीजर के लिए एक लाइब्रेरी है। आप शायद एक डबल का उपयोग कर के बारे में सोचना

BigInteger equivalent in Swift?

0

किया? या NSDecimalNumber?

भी वही फ़ंक्शन दोबारा कॉल करना वास्तव में खराब प्रदर्शन के अनुसार है।

कैसे एक पाश का उपयोग कर के बारे में:

let value = number.intValue - 1 

var sum = NSDecimalNumber(value: number.intValue) 

for i in (1...value).reversed() { 
    sum = sum.multiplying(by: NSDecimalNumber(value: i)) 
} 
संबंधित मुद्दे