تعليمة while

باستعمال تعليمة while، يمكننا إعادة كتابة countdown:
كود:
public static void countdown (int n) {
  while (n > 0) {
    System.out.println (n);
    n = n-1;
  }
  System.out.println ("Blastoff!");
}
يمكنك قراءة تعليمة while كما لو أنها مكتوبة باللغة الطبيعية تقريباً. هذه التعليمة تعني، "طالما n أكبر من الصفر، تابع طباعة قيمة n وبعدها إنقاص قيمة n بقدار 1. عندما تصل للصفر، اطبع الكلمة "'Blastoff!'.
بصورة طبيعية أكثر، يكون مجرى تنفيذ تعليمة while كما يلي:
1. احسب الشرط بين قوسين، يعطي true أو false.
2. إذا كان الشرط غير محقق، اخرج من تعليمة while وتابع التنفيذ عند التعليمة التالية.
3. إذا كان الشرط محققاً، نفذ التعليمات الموجودة بين الأقواس المنحنية، وبعدها ارجع إلى الخطوة 1.
هذا النوع من المسارات يدعى حلقة (loop) لأن الخطوة الثالثة تكون حلقة مع الخطوة الأولى. لاحظ أنه في حال عدم تحقق الشرط عند الوصول إلى الحلقة أول مرة، فلن يتم تنفيذ التعليمات الموجودة داخل الحلقة أبداً. تدعى التعليمات داخل الحلقة أحياناً جسم (body) الحلقة.
يجب أن يتم تغيير قيمة متغير أو أكثر ضمن جسم الحلقة بحيث، في النهاية، يصبح الشرط غير محقق وتنتهي الحلقة. وإلا فإن تكرار الحلقة سيستمر للأبد، وهو ما يدعى بالحلقة اللانهائية (infinite loop). من مصادر التسلية التي لا تنضب بالنسبة لعلماء الكمبيوتر هو ملاحظة أن التعليمات على علبة الشامبو، "ارغي، اشطف، كرر"، هي حلقة لانهائية.
في حالة countdown، يمكننا التأكد أن الحلقة ستنتهي لأننا نعلم أن قيمة n منتهية، ويمكننا أن نرى أن قيمة n تصغر في كل مرة يتم فيها تنفيذ الحلقة (في كل تكرار)، لذا يجب أن نصل إلى الصفر في النهاية. في حالات أخرى لا تكون معرفة ذلك سهلة:
كود:
public static void sequence (int n) {
  while (n != 1) {
    System.out.println (n);
    if (n%2 == 0) { // n is even
      n = n / 2;
    } else {               // n is odd
      n = n*3 + 1;
    }
  }
}
إن شرط هذه الحلقة هو n != 1، لذا فإن تنفيذ الحلقة سيستمر حتى يصبح n مساوياً 1، ما سيجعل الشرط غير محقق.
في كل تكرار، سيطبع البرنامج قيمة n وبعدها يتحقق ما إذا كانت زوجية أو فردية. إذا كانت زوجية، سيتم تقسيمها على 2. إذا كانت فردية، سيتم استبدالها بالقيمة 3n + 1. مثلاً، إذا كانت القيمة الابتدائية (المتحول المرر إلى sequence) تساوي 3، سيكون التتابع الناتج هو 3، 10، 5، 16، 8، 4، 2، 1.
بما أن n يزداد أحياناً وينقص أحياناً أخرى، فلا يوجد أي إثبات واضح على أن n سيصل للواحد، أو أن البرنامج سينتهي. بالنسبة لقيم معينة من n، يمكننا إثبات أن البرنامج سينتهي. مثلاً، إذا كانت القيمة الابتدائية من قوى العدد 2، عندئذ ستكون قيمة n زوجية في كل مرة يتم تنفيذ الحلقة فيها، حتى نصل للواحد. المثال السابق ينتهي بسلسلة مثل هذه، تبدأ بالعدد 16.
إذا وضعنا القيم الخاصة جانباً، فإن السؤال المثير هو هل يمكننا إثبات أن هذا البرنامج سينتهي مع أية قيمة لـ n. حتى الآن، لم يتمكن أي شخص من إثبات ذلك أو إثبات العكس! لمزيد من المعلومات، انظر http://en.wikipedia.org/wiki/Collatz_conjecture.