سلسلة فيبوناتشي في Java استخدام التكرار والحلقات

⚡ ملخص ذكي

سلسلة فيبوناتشي في Java تُنشئ هذه الدالة متتاليةً يكون فيها كل حدٍّ مساويًا لمجموع الحدين السابقين له. تتناول هذه المقالة حلقات التكرار (for و while)، وإدخال المستخدم، والتكرار، والبرامج المُخزَّنة مؤقتًا. tracيقوم بتحليل التكرار، ويقارن التعقيد الزمني لكل نهج.

  • ➕ القاعدة الأساسية: كل حد هو مجموع الحدين السابقين، ويبدأ التسلسل من 0 و1.
  • 🔁 نمط تكراري: يحتوي متغيران على القيم السابقة واللاحقة، ويقوم مجموع مؤقت بنقلها للأمام في كل دورة.
  • 🌀 النمط التكراري: تستدعي الطريقة نفسها مرتين لكل مصطلح، حيث تعمل القيم 0 و1 و2 كحالات أساسية.
  • ⏱️ فجوة التعقيد: تعمل الحلقات في وقت O(n) بينما يعمل الاستدعاء الذاتي البسيط في O(2ⁿ)، والذي يصبح غير قابل للاستخدام بعد حوالي 40 مصطلحًا.
  • 🧠 إصلاح مشكلة التخزين المؤقت: يؤدي تخزين القيم المحسوبة مؤقتًا في مصفوفة إلى استعادة الوقت الخطي مع الحفاظ علىping البنية المتكررة.
  • ⚠️ حد تجاوز السعة: يتجاوز الحد 47 نطاق الأعداد الصحيحة، لذلك يلزم استخدام الأعداد الصحيحة الطويلة أو الكبيرة للتسلسلات الأطول.
  • ⌨️ إدخال المستخدم: تقوم فئة الماسح الضوئي بقراءة العدد المطلوب في وقت التشغيل دون تغيير أي من منطق الإنشاء.

سلسلة فيبوناتشي في Java

ما هي سلسلة فيبوناتشي Java?

A سلسلة فيبوناتشي in Java هي سلسلة من الأعداد يكون فيها العدد التالي هو مجموع العددين السابقين. أول عددين في متتالية فيبوناتشي هما 0 و1. تُستخدم أعداد فيبوناتشي بشكل كبير في دراسة وقت تشغيل الحساب للخوارزمية التي تحدد القاسم المشترك الأكبر لعددين صحيحين.

The Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, ...

ويمكن التعبير عن القاعدة بصيغة رياضية، وهي F(n) = F(n-1) + F(n-2)، حيث F(0) = 0 و F(1) = 1. يوضح الجدول أدناه كيفية إنتاج الحدود الثمانية الأولى.

الموضع (ن) عملية حسابية بعد التخفيض
0 حالة القاعدة 0
1 حالة القاعدة 1
2 0 + 1 1
3 1 + 1 2
4 1 + 2 3
5 2 + 3 5
6 3 + 5 8
7 5 + 8 13

برنامج سلسلة فيبوناتشي في Java باستخدام للحلقة

يحتفظ الإصدار التكراري بقيمتين فقط في الذاكرة في أي لحظة، ولهذا السبب يعمل في وقت خطي ومساحة ثابتة.

//Using  For Loop
public class FibonacciExample {
	public static void main(String[] args)
	{
		// Set it to the number of elements you want in the Fibonacci Series
		 int maxNumber = 10;
		 int previousNumber = 0;
		 int nextNumber = 1;
	        System.out.print("Fibonacci Series of "+maxNumber+" numbers:");
	        for (int i = 1; i <= maxNumber; ++i)
	        {
	            System.out.print(previousNumber+" ");
	            /* On each iteration, we are assigning second number
	             * to the first number and assigning the sum of last two
	             * numbers to the second number
	             */


	            int sum = previousNumber + nextNumber;
	            previousNumber = nextNumber;
	            nextNumber = sum;
	        }
	}
}

الإخراج:

Fibonacci Series of 10 numbers:0 1 1 2 3 5 8 13 21 34

منطق البرنامج:

  • تمت تهيئة المتغير previousNumber إلى 0 وتمت تهيئة المتغير nextNumber إلى 1.
  • تتكرر حلقة فيبوناتشي من خلال maxNumber:
    • اعرض الرقم السابق.
    • احسب مجموع الرقم السابق والرقم التالي.
    • قم بتحديث القيم الجديدة لـ previousNumber و nextNumber.

برنامج سلسلة فيبوناتشي في Java باستخدام أثناء الحلقة

يمكنك أيضًا إنشاء Java متسلسلة فيبوناتشي باستخدام while حلقة في Javaالعمليات الحسابية متطابقة، والتغيير الوحيد هو في صيغة الحلقة.

//Using  While Loop
public class FibonacciWhileExample {
	public static void main(String[] args)
	{
		 int maxNumber = 10, previousNumber = 0, nextNumber = 1;
	        System.out.print("Fibonacci Series of "+maxNumber+" numbers:");

	        int i=1;
	        while(i <= maxNumber)
	        {
	            System.out.print(previousNumber+" ");
	            int sum = previousNumber + nextNumber;
	            previousNumber = nextNumber;
	            nextNumber = sum;
	            i++;
	        }

	}

}

الإخراج:

Fibonacci Series of 10 numbers:0 1 1 2 3 5 8 13 21 34

الفرق الوحيد في منطق البرنامج هو استخدام حلقة while لطباعة أعداد فيبوناتشي. يجب تعريف العداد قبل الحلقة وزيادته داخلها، وإلا فلن تنتهي الحلقة أبدًا.

سلسلة فيبوناتشي بناءً على مدخلات المستخدم

يُعدّ تحديد عدد الكلمات بشكل ثابت في الكود أمرًا مناسبًا للعرض التوضيحي، لكن التمارين الحقيقية عادةً ما تقرأ القيمة من لوحة المفاتيح. تتولى فئة Scanner هذه المهمة في ثلاثة أسطر، وتبقى منطق التوليد دون تغيير.

//fibonacci series based on the user input
import java.util.Scanner;

public class FibonacciUserInput {

    public static void main(String[] args)
    {
        int maxNumber = 0;
        int previousNumber = 0;
        int nextNumber = 1;

        System.out.println("How many numbers you want in Fibonacci:");
        Scanner scanner = new Scanner(System.in);
        maxNumber = scanner.nextInt();
        System.out.print("Fibonacci Series of " + maxNumber + " numbers:");

        for (int i = 1; i <= maxNumber; ++i)
        {
            System.out.print(previousNumber + " ");
            /* On each iteration, we are assigning the second number
             * to the first number and assigning the sum of the last two
             * numbers to the second number
             */

            int sum = previousNumber + nextNumber;
            previousNumber = nextNumber;
            nextNumber = sum;
        }

        scanner.close();
    }
}

تشغيل تجريبي:

How many numbers you want in Fibonacci:
7
Fibonacci Series of 7 numbers:0 1 1 2 3 5 8

منطق البرنامج:
المنطق هو نفسه كما في السابق. بدلاً من تحديد عدد العناصر المراد عرضها بشكل ثابت في الكود... Java سلسلة فيبوناتشي، يُطلب من المستخدم إدخال رقم.

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

وفيما يلي برنامج سلسلة فيبوناتشي في Java باستخدام العودية:

//Using Recursion
public class FibonacciCalc{
	public static int fibonacciRecursion(int n){
	if(n == 0){
		return 0;
	}
	if(n == 1 || n == 2){
			return 1;
		}
	return fibonacciRecursion(n-2) + fibonacciRecursion(n-1);
	}
    public static void main(String args[]) {
	int maxNumber = 10;
	System.out.print("Fibonacci Series of "+maxNumber+" numbers: ");
	for(int i = 0; i < maxNumber; i++){
			System.out.print(fibonacciRecursion(i) +" ");
		}
	}
}

الإخراج:

Fibonacci Series of 10 numbers: 0 1 1 2 3 5 8 13 21 34

منطق البرنامج:

الدالة العودية هي التي لديها القدرة على استدعاء نفسها.

فيبوناتشي ريكورسيون ():

  1. استخدم Java تأخذ دالة التكرار فيبوناتشي عددًا كمدخل. تتحقق من الأعداد 0 و1 و2، وتعيد 0 و1 و1 على التوالي، لأن متتالية فيبوناتشي في Java يبدأ بـ 0، 1، 1.
  2. عندما تكون قيمة المدخل n تساوي 3 أو أكبر، تستدعي الدالة نفسها بشكل متكرر. ويتم الاستدعاء مرتين. tracيتبع ما يلي طلب إدخال القيمة 4.
fibonacciRecursion(4)
    = fibonacciRecursion(2) + fibonacciRecursion(3)

    fibonacciRecursion(2) = 1                    // base case, no further calls
    fibonacciRecursion(3) = fibonacciRecursion(1) + fibonacciRecursion(2)
                          = 1 + 1
                          = 2

    Result: 1 + 2 = 3

تُوقف الحالات الأساسية عملية النزول. ولأن الحالتين 1 و2 تعودان فورًا، فإن فرع fibonacciRecursion(2) لا يتوسع أبدًا، وهذا ما يُبقي trace finite.

متسلسلة فيبوناتشي المُحسَّنة باستخدام التخزين المؤقت

تُعيد الاستدعاءات المتكررة حساب نفس الحدود عدة مرات. يتطلب حساب الحد 40 أكثر من 200 مليون استدعاء. تخزين كل نتيجة عند حسابها لأول مرة يزيل هذا التكرار تمامًا.

public class FibonacciMemo {

    static long[] cache;

    public static long fib(int n) {
        if (n <= 1) {
            return n;
        }
        // return the stored value when it exists
        if (cache[n] != 0) {
            return cache[n];
        }
        cache[n] = fib(n - 1) + fib(n - 2);
        return cache[n];
    }

    public static void main(String[] args) {
        int maxNumber = 90;
        cache = new long[maxNumber + 1];

        System.out.println("Term 50 is: " + fib(50));
        System.out.println("Term 90 is: " + fib(90));
    }
}

الإخراج:

Term 50 is: 12586269025
Term 90 is: 2880067194370816120

⚠️ تحذير: الحد السابع والأربعون من متتالية فيبوناتشي هو 2971215073، وهو يتجاوز الحد الأقصى للأعداد الصحيحة (2147483647) ويتحول إلى قيمة سالبة. عرّف المتغيرات كأعداد صحيحة طويلة (long) بمجرد تجاوز العدد 46، ثم حوّلها إلى أعداد صحيحة كبيرة (BigInteger) بعد الحد 92.

مقارنة طرق فيبوناتشي في Java

تطبع البرامج الأربعة جميعها نفس التسلسل، لذا يعتمد القرار على عدد الحدود المطلوبة.

الأسلوب تعقيد الوقت تعقيد الفضاء الحد العملي
لحلقة O (ن) يا (1) أي عدد، يخضع للنوع الرقمي
حائط اللوب O (ن) يا (1) أي عدد، يخضع للنوع الرقمي
التكرار البسيط يا (2ⁿ) مكدس O(n) حوالي 40 مصطلحًا قبل أن يصبح بطيئًا
التكرار مع التخزين المؤقت O (ن) O (ن) أي عدد، يخضع للنوع الرقمي

يظهر نمط العداد والمراكم نفسه في العديد من التمارين ذات الصلة. تابع مع Java برنامج الكلمات المتناظرةأطلقت حملة Java برنامج للتحقق من الأعداد الأولية، و برنامج لطباعة الأعداد الأولية من 1 إلى 100للاطلاع على التدريبات القائمة على المصفوفات، انظر Bubblفرز إلكتروني Java و Java المصفوفات، ومراجعة لكل حلقة في Java للحصول على صيغة بديلة للحلقة.

الأسئلة الشائعة

كلا الاصطلاحين موجودان. يستخدم علم الحاسوب عادةً 0 و1 كأول حدين، وهو ما تفعله هذه البرامج. بينما تبدأ بعض النصوص الرياضية بـ 1 و1 بدلاً من ذلك.

كل استدعاء يُنتج استدعاءين إضافيين، لذا يتضاعف العمل مع كل حد إضافي. تُحل نفس المسائل الفرعية بشكل متكرر، مما يُنتج نموًا أُسّيًا في عدد الاستدعاءات.

يحتوي نوع البيانات int على حدود تصل إلى الرقم 46، ويحتوي نوع البيانات long على حدود تصل إلى الرقم 92. بعد ذلك، يلزم استخدام BigInteger لأن القيم تتجاوز 64 بت.

تقترب الحدود المتتالية من النسبة الذهبية، والتي تبلغ حوالي 1.618. ويظهر هذا النمط في ترتيب الأوراق، واللوالب الصدفية، ومقاييس التقدير الرشيقة، والتحليل الفني في التداول.

غالباً ما تُعيد هذه الدوال الاستدعاء الذاتي البسيط لأنه المثال الأكثر شيوعاً في الكتب الدراسية. اطلب صراحةً حلاً تكرارياً أو حلاً يعتمد على التخزين المؤقت عندما يكون عدد المصطلحات كبيراً.

إنها أصغر مشكلة حيث يتداخل التخزين المؤقتping تُحقق المسائل الفرعية زيادةً هائلةً في السرعة. ويستند المبدأ نفسه إلى البحث المُخزَّن مؤقتًا وتخزين القيم في خوارزميات تخطيط الذكاء الاصطناعي.

تلخيص هذه التدوينة بـ: