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

ما هي سلسلة فيبوناتشي 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
منطق البرنامج:
الدالة العودية هي التي لديها القدرة على استدعاء نفسها.
فيبوناتشي ريكورسيون ():
- استخدم Java تأخذ دالة التكرار فيبوناتشي عددًا كمدخل. تتحقق من الأعداد 0 و1 و2، وتعيد 0 و1 و1 على التوالي، لأن متتالية فيبوناتشي في Java يبدأ بـ 0، 1، 1.
- عندما تكون قيمة المدخل 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 للحصول على صيغة بديلة للحلقة.
