পাইথনে কারখানাটির জন্য ফাংশন


135

পাইথনের একটি পূর্ণসংখ্যার ফ্যাক্টরিয়াল গণনা সম্পর্কে আমি কীভাবে যেতে পারি?

উত্তর:


191

সবচেয়ে সহজ উপায় হ'ল math.factorial(পাইথন ২.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বা একটি উত্থাপন করুন TypeErrormath.factorialআপনার জন্য এই যত্ন নিতে হবে।


2
আপনি কীভাবে ফাংশনটির factorialমধ্যে ব্যবহার করতে পারবেন তা আমি বুঝতে পারি না factorial। আপনি বর্তমানে যে ফাংশনটি নির্ধারণ করছেন তার মধ্যে আপনি কীভাবে একই ফাংশনটি ব্যবহার করতে পারেন? আমি পাইথনে নতুন তাই আমি কেবল বোঝার চেষ্টা করছি।
J82

8
@ জে ৮২২: এখানে ব্যবহৃত ধারণাটিকে পুনরাবৃত্তি ( en.wikedia.org/wiki/Recursion_ ( কম্পিউটার কম্পিউটার_সায়েন্স ) বলা হয় - একটি ফাংশন কলিং নিজেই পুরোপুরি সূক্ষ্ম এবং প্রায়শই দরকারী।
schnaader

পুনরাবৃত্তি ফাংশন RecursionError998 (চেষ্টা factorial(999)) এর চেয়ে বড় যে কোনও সংখ্যার জন্য উত্থাপন করবে যদি না আপনি পাইথনের পুনরাবৃত্তি সীমা
বরিস

114

পাইথন ২.6 এবং তার উপরে, চেষ্টা করুন:

import math
math.factorial(n)

পাইথন ৩.৯ দিয়ে শুরু করে , floatএই ফাংশনে একটি পাস করা একটি উত্থাপন করবে DeprecationWarning। আপনি যদি এটি করতে চান তবে আপনাকে স্পষ্টভাবে রূপান্তর nকরতে হবে int: math.factorial(int(n))যা দশমিকের পরে কোনও কিছু ফেলে দেবে, তাই আপনি এটি পরীক্ষা করতে পারেনn.is_integer()
বোরিস

25

এটি এত পুরানো থ্রেড হওয়ায় সত্যই প্রয়োজনীয় নয় thread তবে আমি এখানে কিছুক্ষণ লুপ ব্যবহার করে পূর্ণসংখ্যার ফ্যাক্টরিয়াল গণনা করার অন্য উপায় way

def factorial(n):
    num = 1
    while n >= 1:
        num = num * n
        n = n - 1
    return num

4
ফ্যাকটোরিয়াল (-1) 1 এ ফিরে আসবে, ভ্যালুএরর বা অন্য কিছু বাড়িয়ে তুলবে।
f.rodrigues

দশমিকের পরে সংখ্যা সহ আপনি যদি একটি ফ্লোটে পাস করেন তবে এই ফাংশনটি ভুল ফলাফল তৈরি করবে।
বরিস

এই ফাংশনটির সাথে, আমি প্রথম চারটি পূর্ণসংখ্যার ফ্যাক্টরিয়াল মুদ্রণ করতে চাই। আমি যখন প্রতিটি কারখানার জন্য এটির num = num * nসাথে লাইন অবস্থান পরিবর্তন করি n = n - 1এবং চালিত করি for i in range(1, 5): print('Factorial of', i, 'is', factorial(i))তখন আউটপুট 0 হয় I আমি num = num * nপ্রথমে কেন আসার যুক্তিটি জানতে চাই come ধন্যবাদ !!

18

বিদ্যমান সমাধান

সবচেয়ে সংক্ষিপ্ত এবং সম্ভবত দ্রুত সমাধানটি হ'ল:

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)


5

যদি আপনি পাইথন 2.5 বা তার চেয়ে বেশি পুরানো ব্যবহার করে থাকেন

from operator import mul
def factorial(n):
    return reduce(mul, range(1,n+1))

নতুন পাইথনের জন্য, এখানে অন্যান্য উত্তরের হিসাবে গণিত মডিউলটিতে ফ্যাকটোরিয়াল রয়েছে


এটি পাইথন 2-কেবল উত্তর, reduceপাইথন 3 থেকে সরানো হয়েছে
বরিস

@ বোরিস, পাইথন 3-এ আপনাকে কেবল যুক্ত করতে হবেfrom functools import reduce
জন লা রোয়

এটি একটি কারণে সরিয়ে দেওয়া হয়েছে, আপনি এটি ব্যবহার করবেন না artima.com/weblogs/viewpost.jsp?thread=98196
বরিস


4

একটি- forলুপ ব্যবহার করে , এর থেকে পিছনে গণনা n:

def factorial(n):
    base = 1
    for i in range(n, 0, -1):
        base = base * i
    print(base)

3

কার্য সম্পাদনের কারণে, দয়া করে পুনরাবৃত্তিটি ব্যবহার করবেন না। এটি বিপর্যয়কর হবে।

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

1
আমি মনে করি এটি লুপটিকে কিছুটা পরিষ্কার দেখায় <! - ভাষা: পাইথন -> ডিফ ফ্যাক্ট (এন): ret = 1 যখন এন> 1: এন, রেট = এন - 1, রেট * এন রিটার্ন
এডিলিও

1
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

1

এখানে আমার চেষ্টা

>>> 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

একটি লাইন, দ্রুত এবং বড় সংখ্যক এছাড়াও কাজ করে:

#use python3.6.x for f-string
fact = lambda x: globals()["x"] if exec(f'x=1\nfor i in range(1, {x+1}):\n\tx*=i', globals()) is None else None

0

আমি জানি এটির উত্তর দেওয়া হয়েছে তবে বিপরীত পরিসীমা তালিকার বোধগম্যতার সাথে এখানে আরও একটি পদ্ধতি রয়েছে, এটি পরিসীমাটি আরও সহজ করে এবং আরও কমপ্যাক্ট করে তোলে:

    #   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!" )

আপনি এই सारটিটির মধ্যে কোডের একটি সম্পূর্ণ সংস্করণ দেখতে পাবেন: https://gist.github.com/sadmicrowave/d4fbefc124eb69027d7a3131526e8c06


1
ব্যবহার করার প্রয়োজন নেই [n for n in range(num, 0, -1)], rangeইতিমধ্যে পুনরাবৃত্তিযোগ্য।
মিশন

0

এটি করার আরেকটি উপায় হ'ল np.prodনীচে দেখানো ব্যবহার করা :

def factorial(n):
    if n == 0:
        return 1
    else:
         return np.prod(np.arange(1,n+1))

0

গৌণিক একটি ধনাত্মক পূর্ণসংখ্যা এন, এন দ্বারা প্রকাশ এর !, কম সব ধনাত্মক পূর্ণসংখ্যা গুণফল বা এন সমান।

সূত্র :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))

0
def factorial(n):
mul = 1
for i in range( 1, n + 1):
    mul *= i
print(factorial(6))

আরও একটি প্রশ্ন জিজ্ঞাসা করা হ'ল এটি অন্যান্য 17 টি উত্তরগুলির মধ্যে কী যুক্ত করে।
পিপ্পারি

এই উত্তর এই বিদ্যমান উত্তর সদৃশ stackoverflow.com/a/5136481
Karel

0

নীচের কোডে, আমি সেই সংখ্যার ইনপুট নিচ্ছি যার বিবরণী আমি গণনা করতে চাই, তার পরে আমি -> সংখ্যাটি গুণ করছি যাটির ফ্যাক্টরিয়াল আমরা 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.