مقدمة
لقد رأيت هذا المحتوى مؤخرًا عندما كنت أقرأ كتابًا وشعرت بالمكافأة. يستخدم التكرار حلقة (ل ، بينما ، قم ... Wile) أو التكرار ، والذي يخرج عندما لا يتم الوفاء بحالة الحلقة. العودية هي عمومًا عودية وظيفية ، والتي يمكن تسميتها بمفردها أو عن طريق المكالمات غير المباشرة ، أي الطريقة A Method Metter B ، و Method B Method A PRALTE ، وشرط الخروج العودية هو عبارة IF وإلا ، وينتهي عندما تلبي الحالة الأساس.
ما ورد أعلاه هي خصائص بناء الجملة للتكرار والتكرار. ما هي الاختلافات بينهما في جافا؟ دعنا نتعلم المزيد حول هذا المقال أدناه.
1. عودة
عندما يتعلق الأمر بالتكرار ، علينا أن نذكر تعبيرًا رياضيًا: n!=n*(n-1)*(n-2)*...*1
هناك العديد من الطرق لحساب العوامل. أي شخص لديه أساس رياضي معين يعرف n!=n*(n-1)! لذلك ، يمكن كتابة تطبيق الكود مباشرة على النحو التالي:
الرمز 1
int factorial (int n) {if (n == 1) {return 1 ؛ } آخر {return n*factorial (n-1) ؛ }} عند تنفيذ الكود أعلاه ، يحتاج الماكينة فعليًا إلى إجراء سلسلة من الضربات: factorial(n) → factorial(n-1) → factorial(n-2) → ... → factorial(1) . لذلك ، من الضروري تتبع (تتبع نتيجة الحساب الأخير) وضرب الاتصال لإجراء الحسابات (بناء سلسلة مضاعفة). هذا النوع من العمليات التي تسميها باستمرار نفسها تسمى العودية. يمكن تقسيم العودية إلى عودة خطي وكرات عددية. يزيد مقدار المعلومات خطيًا مع إدخال الخوارزمية. ويسمى العودية العودية الخطية. حساب n! (المصنع) هو عودة خطية. لأنه مع زيادة N ، يزداد الوقت اللازم للحساب خطيًا. يسمى نوع آخر من المعلومات التي تنمو بشكل كبير مع زيادة المدخلات عودية الأشجار.
2. التكرار
طريقة أخرى لحساب n! IS: أولاً ، احسب 1 مضاعفة بمقدار 2 ، ثم اضرب النتيجة بمقدار 3 ، ثم اضرب النتيجة بمقدار 4 ... وضرب حتى N. أثناء تنفيذ البرنامج ، يمكن تحديد عداد. في كل مرة يتم فيها إجراء الضرب ، يتم زيادة العداد مرة واحدة حتى تكون قيمة العداد مساوية لـ N. كما يلي:
الرمز الثاني
int factorial (int n) {int product = 1 ؛ لـ (int i = 2 ؛ i <n ؛ i ++) {product *= i ؛ } إرجاع المنتج ؛}بالمقارنة مع الرمز الأول ، لا يقوم الرمز الثاني ببناء سلسلة الضرب. عند إجراء كل خطوة من خطوة الحساب ، تحتاج فقط إلى معرفة النتيجة الحالية (المنتج) وقيم I. هذا الشكل من الحساب يسمى التكرار. هناك عدة شروط للتكرار: 1. هناك متغير ذو قيمة أولية. 2. قاعدة تشرح كيفية تحديث القيم المتغيرة. 3. حالة نهاية. (ثلاثة عناصر من الحلقة: متغيرات الحلقة ، وأجسام الحلقة وظروف إنهاء الحلقة). نفس العودية. يمكن تسمية متطلبات الوقت التي تصبح خطيًا لأن الإدخال ينمو خطيًا.
3. التكرار مقابل العودية
بعد مقارنة البرنامجين ، يمكننا أن نجد أنهما يبدوا متماثلين تقريبًا ، خاصةً من حيث وظائفهما الرياضية. عند حساب N! ، خطوات الحساب الخاصة بهم تتناسب مع قيمة n. ومع ذلك ، إذا أخذنا وجهة نظر البرنامج وفكروا في كيفية تشغيلها ، فإن الخوارزميتين مختلفتين تمامًا.
(ملاحظة: النص الأصلي غير ذي صلة بالفرق ، لذلك لن أترجمه هنا. فيما يلي ملخص المؤلف.)
بادئ ذي بدء ، تحليل العودية. في الواقع ، فإن أكبر شيء في التكرار هو تحلل خوارزمية معقدة إلى عدة خطوات متكررة قابلة للتكرار. لذلك ، فإن استخدام العودية لتنفيذ المنطق الحسابي لا يتطلب سوى رمز قصير للغاية لحلها ، ويكون الفهم هذا الرمز أسهل. ومع ذلك ، فإن العودية تعني عددًا كبيرًا من مكالمات الوظائف. سبب تسجيل الحالة المحلية لمكالمة الوظيفة باستخدام مكدس. لذلك ، قد يضيع هذا الكثير من المساحة ، وإذا كان العودية عميقًا جدًا ، فقد يتسبب ذلك في تجاوز الفائض.
بعد ذلك ، تحليل التكرارات. في الواقع ، يمكن استبدال التكرار بالتكرار. ومع ذلك ، بالمقارنة مع بساطة وفهم العودية ، يكون التكرار أكثر صلابة ويصعب فهمه. خاصة عند مواجهة سيناريو أكثر تعقيدًا. ومع ذلك ، فإن صعوبة فهم الكود تجلب أيضًا نقاطًا أكثر وضوحًا. كفاءة التكرار أعلى من العودية وهي أيضًا صغيرة نسبيًا في استهلاك المساحة.
يجب أن يكون هناك تكرار في عودة ، ولكن قد لا تكون هناك علامات في التكرارات ، ويمكن تحويل معظمها إلى بعضها البعض.
إذا كنت تستطيع استخدام التكرار ، فلا تستخدم العودية. وظائف الاتصال بشكل متكرر لا تضيع المساحة فحسب ، بل يمكن أن تسبب بسهولة في تدفق المكدس إذا كانت العودية عميقة جدًا.
4. عودة الأرقام
كما ذكرنا سابقًا ، فإن مقدار المعلومات التي يزدادها الشجرة العودية بشكل كبير مع زيادة المدخلات. تسلسل فيبوناتشي مثال نموذجي:
في وصف النص ، فإن مجموع الرقمين الأولين في تسلسل فيبوناتشي يساوي الرقم الثالث: 0 ، 1 ، 1 ، 2 ، 3 ، 5 ، 8 ، 13 ، 21 ...
رمز التنفيذ العودية كما يلي:
int fib (int n) {if (n == 0) {return 0 ؛ } آخر إذا (n == 1) {return 1 ؛ } آخر {return fib (n-1) + fib (n-2) ؛ }} أثناء عملية الحساب ، من أجل حساب fib(5) ، يجب على البرنامج أولاً حساب fib(4) و fib(3) . من أجل حساب fib(4) ، يحتاج البرنامج أيضًا إلى حساب fib(3) و fib(2) أولاً. يتم حساب FIB (3) مرتين خلال هذه العملية.
من عملية الحساب التي تم تحليلها أعلاه ، يمكننا استنتاج استنتاج: هناك حساب زائد لسلسلة فيبوناتشي باستخدام العودية.
كما ذكر أعلاه ، يمكن تنفيذ الخوارزميات العودية عمومًا بواسطة تكرار ، وينطبق الشيء نفسه على حسابات تسلسل فيبوناتشي.
int fib (int n) {int fib = 0 ؛ int a = 1 ؛ لـ (int i = 0 ؛ i <n ؛ i ++) {int temp = fib ؛ FIB = FIB + A ؛ أ = درجة الحرارة ؛ } إرجاع fib ؛}على الرغم من أنه سيكون هناك حسابات زائدة في طريقة العودية ، إلا أنه يمكن استبدالها بالتكرار. ولكن هذا لا يعني أنه يمكن استبدال التكرار بالكامل. لأن العودية لها قابلية للقراءة أفضل.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون محتوى هذه المقالة مفيدًا للجميع في التعلم أو استخدام Java. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل.