مزيد من العَودية الرياضية

12.4 مزيد من العَودية الرياضية

أهداف التعلم

في نهاية هذا القسم، ينبغي أن تكون قادرًا على

  • تعريف دالّة عَودية لتوليد أعداد فيبوناتشي.

متتالية فيبوناتشي باستخدام العَودية

متتالية فيبوناتشي هي متتالية يكون فيها كل عدد مجموع العددين السابقين له في المتتالية. العددان الأولان هما 0 و 1. وهكذا، بدءًا من 0 و 1، العدد الثالث 0 + 1 = 1، والعدد التالي 1 + 1 = 2. متتالية الأعداد هي 0، 1، 1، 2، 3، 5، 8، 13، 21، 34، ... .

يمكن استخدام العَودية لحساب العدد النوني في متتالية فيبوناتشي. الحالات الأساسية هي 0 و 1. بعد ذلك، يُعطى العدد النوني بجمع العددين (ن - 1) و (ن - 2). وهكذا، fib(n) = fib(n - 1) + fib(n - 2)، وهو تعريف عَودي ينتهي بالحالات الأساسية f(0) = 0، و f(1) = 1.

بالنسبة للعَودية التي تستدعي دوال متعددة في الحالة العَودية، فإن تتبع مسار العَودية يكون مفيدًا. يُطلق على الهيكل المستخدم لتتبع الاستدعاءات التي تُجريها دالّة عَودية اسم شجرة العَودية. تتبع العرض التوضيحي أدناه شجرة العَودية لاستدعاء دالّة عَودية لحساب عدد فيبوناتشي لـ n = 5.

مثال 12.1

إيجاد العدد النوني في متتالية فيبوناتشي

عَودية دالّة فيبوناتشي أكثر تعقيدًا، إذ تعتمد القيمة عند n على استدعاءين للدالّة بقيم أصغر.

    """ Recursive Fibonacci function """

    def fib(n):
      # الحالة الأساسية
      if n == 0 or n == 1:
        return n
      # الحالة العَودية
      elif n > 1:
        return fib(n - 1) + fib(n - 2)
      # حالة الخطأ
      else:
        print("Fibonacci numbers begin at 0.")
        return

    # شِفرة اختبار
    print(fib(7))

ناتج الشِفرة أعلاه:

    13

نقطة تحقق

دالّة فيبوناتشي العَودية

مفاهيم تطبيقية

أعداد فيبوناتشي

1.
ينتج عن fib(9) _____.
  1. 13
  2. 21
  3. 34
2.
كم عدد الاستدعاءات للحالات الأساسية التي تتم نتيجة استدعاء fib(5)؟
  1. 2
  2. 5
  3. 8
3.
يُطلق على الهيكل الذي يتتبع استدعاءات الدالّة الناتجة عن استدعاء دالّة عَودية معقدة اسم _____.
  1. شجرة
  2. شجرة العَودية
  3. شجرة التكرار

القاسم المشترك الأكبر (GCD)

القاسم المشترك الأكبر لعددين صحيحين موجبين عدد صحيح يقسمهما معًا. مثال: القاسم المشترك الأكبر للعددين 6 و 9 هو 3 لأن 3 × 2 = 6، و 3 × 3 = 9.

يُمكن إيجاد القاسم المشترك الأكبر بسهولة باستخدام طريقة إقليدس. تطرح طريقة إقليدس العدد الصحيح الأصغر من العدد الصحيح الأكبر بشكل عَودي حتى تُبلَغ حالة أساسية يكون فيها العددان الصحيحان متساويين. القاسم المشترك الأكبر قيمة العدد الصحيح عند بلوغ الحالة الأساسية.

مثال 12.2

إيجاد القاسم المشترك الأكبر

    """ Find GCD using recursive implementation of Euclid's method """

    def gcd(a, b):
      if a == b: # الحالة الأساسية
        return a
      elif a < b: # الحالة العَودية
        return gcd(a, b - a)
      else:
        return gcd(a - b, a)

    # شِفرة اختبار
    print(gcd(24, 30))

ناتج الشِفرة أعلاه:

    6

مفاهيم تطبيقية

القاسم المشترك الأكبر

4.
ما هو القاسم المشترك الأكبر للعددين 15 و 35؟
  1. 15
  2. 20
  3. 5
5.
كم عدد الاستدعاءات العَودية التي تتم باستخدام gcd(24, 30)؟
  1. 4
  2. 1
  3. 24
6.
ما هو القاسم المشترك الأكبر للعددين 13 و 23؟
  1. 13
  2. 1
  3. 23
7.
كم عدد الاستدعاءات العَودية التي تتم باستخدام gcd(13, 23)؟
  1. 1
  2. 8
  3. 13

جرّب بنفسك

القوة العَودية

اكتب دالّة power() عَودية، بحيث إذا أُعطي عدد صحيح x وعدد صحيح موجب y، فإن power(x, y) تُرجع x مرفوعًا للقوة y.

مثال: power(3, 4) تُرجع 81.

جرّب بنفسك

القوة العَودية (مع أي قوة عدد صحيح)

اكتب دالّة عَودية rec_pow() بحيث إذا أُعطي عددين صحيحين، x و y، فإنها تُرجع x مرفوعًا للقوة y.

(ملاحظة: هذا امتداد للمشكلة أعلاه ولكنه يعمل الآن لأي قيمة عدد صحيح لـ y، سواء كانت موجبة أو سالبة. كيف يجب أن تتغير الدالّة العَودية للتعامل مع قيمة سالبة لـ y؟)

مثال: rec_pow(2, -4) تُرجع 0.0625.