Python Programming

حساب عاملي فعال في بايثون

Spread the love

عاملية عدد صحيح غير سالب n، التي يرمز إليها بـ n!، هي حاصل ضرب جميع الأعداد الصحيحة الموجبة الأصغر من أو تساوي n. على سبيل المثال، 5! = 5 × 4 × 3 × 2 × 1 = 120. تعتبر العوامل أساسية في علم التوافقيات واحتمالات. تستعرض هذه المقالة ثلاث طرق لحساب العوامل في بايثون: التكرار، والرجوع الذاتي، ودالة math.factorial() المُحسّنة.

جدول المحتويات

  1. حساب العوامل بالتكرار
  2. حساب العوامل بالرجوع الذاتي
  3. استخدام دالة math.factorial()
  4. مقارنة الطرق

حساب العوامل بالتكرار

يوفر التكرار نهجًا مباشرًا. تقوم الحلقة بضرب الأعداد بشكل متسلسل:


def factorial_iterative(n):
  """يحسب عاملي عدد صحيح غير سالب بالتكرار.

  الحجج:
    n: العدد الصحيح غير السالب.

  المرتجعات:
    عاملي n. يُرجع 1 إذا كان n يساوي 0.
    يرفع ValueError إذا كان n سالبًا.
  """
  if n < 0:
    raise ValueError("عاملي غير معرف للأعداد السالبة.")
  elif n == 0:
    return 1
  else:
    result = 1
    for i in range(1, n + 1):
      result *= i
    return result

# مثال
number = 5
result = factorial_iterative(number)
print(f"عاملي {number} هو {result}")  # المخرجات: عاملي 5 هو 120

هذه الطريقة فعالة وسهلة الفهم، وتتجنب مشاكل تجاوز سعة المكدس الكامنة في الرجوع الذاتي.

حساب العوامل بالرجوع الذاتي

يوفر الرجوع الذاتي بديلًا موجزًا. تستدعي الدالة العودية نفسها حتى يتم الوصول إلى حالة الأساس (n = 0، 0! = 1):


def factorial_recursive(n):
  """يحسب عاملي عدد صحيح غير سالب بالرجوع الذاتي.

  الحجج:
    n: العدد الصحيح غير السالب.

  المرتجعات:
    عاملي n. يُرجع 1 إذا كان n يساوي 0.
    يرفع ValueError إذا كان n سالبًا.
  """
  if n < 0:
    raise ValueError("عاملي غير معرف للأعداد السالبة.")
  elif n == 0:
    return 1
  else:
    return n * factorial_recursive(n - 1)

# مثال
number = 5
result = factorial_recursive(number)
print(f"عاملي {number} هو {result}")  # المخرجات: عاملي 5 هو 120

على الرغم من أناقته، إلا أن الرجوع الذاتي قد يكون أبطأ بالنسبة لقيم n الكبيرة وقد يصل إلى حد عمق الرجوع الذاتي في بايثون بسبب زيادة حجم مكدس الاستدعاءات.

استخدام دالة math.factorial()

يوفر مُعامل math في بايثون دالة factorial() مُحسّنة للغاية:


import math

def factorial_math(n):
  """يحسب عاملي باستخدام math.factorial().

  الحجج:
    n: العدد الصحيح غير السالب.

  المرتجعات:
    عاملي n.
    يرفع ValueError إذا كان n سالبًا أو ليس عددًا صحيحًا.
  """
  if not isinstance(n, int) or n < 0:
    raise ValueError("يجب أن يكون المدخل عددًا صحيحًا غير سالب.")
  return math.factorial(n)

# مثال
number = 5
result = factorial_math(number)
print(f"عاملي {number} هو {result}")  # المخرجات: عاملي 5 هو 120

هذا هو النهج المُوصى به لكفاءته وقوته وقدرته على التعامل مع الأعداد الأكبر، مستفيدًا من التعليمات البرمجية المُحسّنة بلغة C.

مقارنة الطرق

في حين أن طرق التكرار والرجوع الذاتي توفر قيمة تعليمية، إلا أن math.factorial() أفضل بشكل عام من حيث الأداء ومعالجة الأخطاء في التطبيقات العملية. يعتمد الاختيار على السياق: قد تفضل الأغراض التعليمية نهج التكرار أو الرجوع الذاتي، بينما تستفيد أكواد الإنتاج بشكل كبير من الدالة المُدمجة المُحسّنة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *