जवाबों:
सबसे आसान तरीका उपयोग करना है math.factorial(पायथन 2.6 और उससे ऊपर में उपलब्ध है):
import math
math.factorial(1000)
यदि आप इसे स्वयं लिखना चाहते हैं, तो आप पुनरावृत्त दृष्टिकोण का उपयोग कर सकते हैं:
def factorial(n):
fact = 1
for num in range(2, n + 1):
fact *= num
return fact
या एक पुनरावर्ती दृष्टिकोण:
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
ध्यान दें कि फैक्टरियल फ़ंक्शन केवल सकारात्मक पूर्णांकों के लिए परिभाषित किया गया है, इसलिए आपको यह n >= 0और वह भी जांचना चाहिए isinstance(n, int)। यदि ऐसा नहीं है, एक उठाना ValueErrorया एक TypeErrorक्रमशः। math.factorialआप के लिए इस का ख्याल रखना होगा।
RecursionError998 (कोशिश factorial(999)) की तुलना में किसी भी संख्या के लिए बड़ा होगा
पायथन 2.6 और ऊपर, कोशिश करें:
import math
math.factorial(n)
floatइस समारोह के लिए एक गुजर एक होगा DeprecationWarning। यदि आप ऐसा करना चाहते हैं, तो आपको nएक intस्पष्ट रूप से परिवर्तित करने की आवश्यकता है : math.factorial(int(n))जो दशमलव के बाद कुछ भी छोड़ देगा, इसलिए आप यह जांचना चाहते हैं किn.is_integer()
वास्तव में आवश्यक नहीं है क्योंकि यह इतना पुराना धागा है। लेकिन मैंने यहाँ किया था एक लूप का उपयोग करके पूर्णांक के भाज्य की गणना करने का एक और तरीका।
def factorial(n):
num = 1
while n >= 1:
num = num * n
n = n - 1
return num
num = num * nसाथ लाइन की स्थिति स्वैप करता हूं n = n - 1और इसे चलाता for i in range(1, 5): print('Factorial of', i, 'is', factorial(i))हूं, तो प्रत्येक तथ्य के लिए, आउटपुट 0. मैं औचित्य जानना चाहूंगा कि num = num * nपहले क्यों आने की जरूरत है। धन्यवाद!!
सबसे छोटा और शायद सबसे तेज़ समाधान है:
from math import factorial
print factorial(1000)
आप अपना समाधान भी बना सकते हैं। आम तौर पर आपके पास दो दृष्टिकोण होते हैं। जो मुझे सबसे अच्छा लगता है वह है:
from itertools import imap
def factorial(x):
return reduce(long.__mul__, imap(long, xrange(1, x + 1)))
print factorial(1000)
(यह बड़ी संख्या के लिए भी काम करता है, जब परिणाम बन जाता है long)
उसी को प्राप्त करने का दूसरा तरीका है:
def factorial(x):
result = 1
for i in xrange(2, x + 1):
result *= i
return result
print factorial(1000)
यदि आप Python2.5 या पुराने प्रयास का उपयोग कर रहे हैं
from operator import mul
def factorial(n):
return reduce(mul, range(1,n+1))
नए पायथन के लिए, गणित मॉड्यूल में तथ्यात्मक है जैसा कि यहां अन्य उत्तरों में दिया गया है
reduceपायथन 3 से हटा दिया गया था
from functools import reduce
def fact(n, total=1):
while True:
if n == 1:
return total
n, total = n - 1, total * n
cProfile.run('fact(126000)')
4 function calls in 5.164 seconds
स्टैक का उपयोग करना सुविधाजनक है (जैसे पुनरावर्ती कॉल), लेकिन यह एक लागत पर आता है: विस्तृत जानकारी संग्रहीत करने में बहुत अधिक मेमोरी लग सकती है।
यदि स्टैक अधिक है, तो इसका मतलब है कि कंप्यूटर फ़ंक्शन कॉल के बारे में बहुत सारी जानकारी संग्रहीत करता है।
विधि केवल निरंतर मेमोरी (जैसे पुनरावृत्ति) लेती है।
def fact(n):
result = 1
for i in range(2, n + 1):
result *= i
return result
cProfile.run('fact(126000)')
4 function calls in 4.708 seconds
def fact(n):
return math.factorial(n)
cProfile.run('fact(126000)')
5 function calls in 0.272 seconds
def factorial(n):
result = 1
i = n * (n -1)
while n >= 1:
result = result * n
n = n - 1
return result
print (factorial(10)) #prints 3628800
यहाँ मेरी कोशिश है
>>> import math
>>> def factorial_verbose(number):
... for i in range(number):
... yield f'{i + 1} x '
...
>>> res = ''.join([x for x in factorial_verbose(5)])
>>> res = ' '.join([res[:len(res)-3], '=', str(math.factorial(5))])
>>> res
'1 x 2 x 3 x 4 x 5 = 120'
मैं जानता हूं कि इसका उत्तर दिया जा चुका है, लेकिन यहां रिवर्स रेंज लिस्ट कॉम्प्रिहेंशन के साथ एक और तरीका है, जिससे रेंज को पढ़ना और अधिक कॉम्पैक्ट बनाना आसान हो जाता है:
# 1. Ensure input number is an integer by attempting to cast value to int
# 1a. To accomplish, we attempt to cast the input value to int() type and catch the TypeError/ValueError
# if the conversion cannot happen because the value type is incorrect
# 2. Create a list of all numbers from n to 1 to then be multiplied against each other
# using list comprehension and range loop in reverse order from highest number to smallest.
# 3. Use reduce to walk the list of integers and multiply each against the next.
# 3a. Here, reduce will call the registered lambda function for each element in the list.
# Reduce will execute lambda for the first 2 elements in the list, then the product is
# multiplied by the next element in the list, and so-on, until the list ends.
try :
num = int( num )
return reduce( lambda x, y: x * y, [n for n in range(num, 0, -1)] )
except ( TypeError, ValueError ) :
raise InvalidInputException ( "Input must be an integer, greater than 0!" )
आप इस gist के भीतर कोड का एक पूर्ण संस्करण देख सकते हैं: https://gist.github.com/sadmicrowave/d4fbefc124eb69027d7a3131526e8c06
[n for n in range(num, 0, -1)], rangeपहले से ही चलने योग्य है।
कारख़ाने का एक सकारात्मक पूर्णांक एन, एन द्वारा सूचित किया जाता का !, कम से कम सभी सकारात्मक पूर्णांक उत्पाद है या n के बराबर।
सूत्र :n! = n * (n-1) * (n-2) * (n-3) * (n-4) * ....... * 1
बिलियन फनटेशन / लाइब्रेरी आदि का उपयोग करके अजगर में फैक्टरियल खोजने की कई विधियाँ हैं। यहाँ मैंने फैक्टरियल की मूल परिभाषा के संदर्भ में उपयोगकर्ता-परिभाषित फ़ंक्शन बनाया है।
def factorial(n):
fact = 1
for i in range(1,n+1):
fact = fact * i
return(fact)
print(factorial(4))
हम recursiveनीचे दिखाए गए अनुसार तकनीक का उपयोग करके फैक्टरियल फ़ंक्शन को भी लागू कर सकते हैं। लेकिन यह विधि केवल छोटे पूर्णांक मानों के लिए कुशल है। क्योंकि पुनरावृत्ति में, फ़ंक्शन को बार-बार कॉल किया जाता है और स्टैक को बनाए रखने के लिए मेमोरी स्पेस की आवश्यकता होती है जो कि फैक्टरियल खोजने के लिए बड़े पूर्णांक मानों के लिए एक कुशल या अनुकूलित दृष्टिकोण नहीं है।
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
print(factorial(4))
def factorial(n):
mul = 1
for i in range( 1, n + 1):
mul *= i
print(factorial(6))
नीचे दिए गए कोड में, मैं उस संख्या का इनपुट ले रहा हूं, जिसकी मैं जिस तथ्यात्मक गणना करना चाहता हूं, उसके बाद मैं उस -> संख्या को गुणा कर रहा हूं, जिसकी संख्या को हम 1,2 से शुरू होने वाली संख्याओं के साथ गणना करना चाहते हैं, ...., (संख्या जिसका भाज्य मैं -1 की गणना करना चाहता हूं)
f = int(input("Enter a number whose factorial you want to calculate = "))#Number
#whose factorial I want to calculate
for i in range(1,f): #assume I have taken f as 5
f=f*i # In 1st iteration f=5*1 => 5 , in second iteration f = 5*2 => 10, 3rd
#iteration f = 10*3 =>30, 4th iteration f = 30*4 =>120
print(f) #It will print the updated value of "f" i.e 120
factorialभीतर कैसे उपयोग कर सकते हैंfactorial। जिस फ़ंक्शन को आप वर्तमान में परिभाषित कर रहे हैं, आप उसी फ़ंक्शन का उपयोग कैसे कर सकते हैं? मैं अजगर के लिए नया हूं इसलिए मैं सिर्फ समझने की कोशिश कर रहा हूं।