על קוצו של יוד

הנה חידה שראיתי מזמן מזמן, והיא תמיד מצאה חן בעיני: השיטה הבאה אמורה להדפיס 20 כוכביות על המסך. היא לא עושה את זה, כמובן, כי יש טעות בלולאה:

public void f()

{

    int i, n = 20;

    for(i = 0; i > n; i–)

        System.out.print(“*”);

}

עליכם להוסיף תו אחד בלבד לקוד השיטה כך שהיא תדפיס 20 כוכביות על המסך. מותר לכם להוסיף איזה תו שתרצו (כולל רווח או שורה חדשה) בכל מקום שתרצו בגוף השיטה, אבל רק תו אחד! למשל, אפשר להוסיף למשל את הסימן ‘=’ אחרי הסימן ‘<‘ בלולאה, ככה שהיינו מקבלים =<. או שאפשר להוסיף רווח אחד בתוך הגרשיים בפקודת ההדפסה. או כל תו אחר.

(יש שני פתרונות שאני מכיר)

אז מוכנים לפתרון?

כמו שניתן לראות, הלולאה אינסוופית, כיוון ש-i מתחיל ב-0 ויורד באחד בכל איטרציה, ככה שהוא לעולם לא יהיה גדול מ-n. כיוון שעלינו להוסיף תו אחד בלבד, אז פתרון אפשרי אחד הוא להוסיף את הספרה ‘4’ לפני ה-0 באתחול של i, ככה –

public void f()

{

    int i, n = 20;

    for(i = 40; i > n; i–)

        System.out.print(“*”);

}

כעת i מתחיל מ-40, הלולאה תמשיך כל עוד הוא גדול מ-20 וערכו של i ירד באחד בכל איטרציה.

ופתרון שני – אפשר להוסיף את הסימן ‘-‘ (מינוס) לפני ה-20 שבאתחול של n, ככה –

public void f()

{

    int i, n = -20;

    for(i = 0; i > n; i–)

        System.out.print(“*”);

}

כעת אמנם i מתחיל מאפס וערכו קטן באחד בכל איטרציה, אבל תנאי העצירה הוא כאשר i יהיה שווה ל -20, ככה שהלולאה תתבצע 20 פעמים ותדפיס 20 כוכביות.