در حال بارگذاری...

بازگشت در Java

متدی به نام down بنویسید که یک int به نام n بگیرد. اگر n صفر یا کمتر باشد، با یک return; خالی بایستید. وگرنه n را چاپ کنید، بعد از داخل همان متد down(n - 1) را صدا بزنید. از main صدا بزنید down(3);. صفحه باید سه خط نشان دهد: 3، بعد 2، بعد 1. متد خودش را با عدد کوچک‌تر صدا می‌زند تا توقف زنجیره را تمام کند. همین خودصدا زدن با توقف کار این صفحه است.

متدی که خودش را صدا می‌زند

روی صفحهٔ محدودهٔ نام، mark یک‌بار اجرا می‌شد و تمام می‌شد. اینجا down اجرا می‌شود، بعد قبل از اینکه صدای اول کامل تمام شود یک down دیگر با آرگومان تازه شروع می‌کند. هر صدا n خودش را دارد. زنجیره فقط وقتی تمام می‌شود که یک صدا به توقف برسد.
یک برنامهٔ کوچک با نام Ladder.java بسازید. public class روی خط اول باید با نام فایل یکی باشد: public class Ladder. نام کلاس قدیمی Gate یا Sign را در این فایل نگه ندارید؛ کامپایلر انتظار دارد نام کلاس و نام فایل جور باشند.
بیرون از main، هنوز داخل آکولاد کلاس، بنویسید static void down(int n). روی این صفحه void را نگه دارید: هر گام چاپ می‌کند و لازم نیست مقداری با return تایپ‌دار برگردد. توقف از return; بدون مقدار استفاده می‌کند — فقط همین صدا را تمام می‌کند. قبل از کامپایل فایل را ذخیره کنید. برنامهٔ کامل اول در جعبهٔ بعدی است.

Ladder.java با down

این نسخه‌ای است که اول کامپایل می‌کنید. main یک صدا نگه می‌دارد. down توقف، چاپ، و خودصدا زدن را نگه می‌دارد.

down prints then calls itself

java
public class Ladder {
    public static void main(String[] args) {
        down(3);
    }

    static void down(int n) {
        if (n <= 0) {
            return;
        }
        System.out.println(n);
        down(n - 1);
    }
}

از پوشه‌ای که Ladder.java آنجاست، javac Ladder.java را اجرا کنید. وقتی پرانتز و آکولاد و نقطه‌ویرگول‌ها جور باشند، javac خودش خطی نمی‌نویسد. بعد java Ladder را اجرا کنید — نه java Ladder.java. پسوند .java را از فرمان دوم بردارید. همین دو فرمان در Windows و macOS کار می‌کند. برنامه باید سه خط چاپ کند و تمام شود: 3، بعد 2، بعد 1. منتظر تایپ شما نمی‌ماند. اگر ترمینال منتظر ماند، هنوز nextLine از تمرین قدیمی داخل فایل است. آن را پاک کنید و down(3); به‌همراه متد down بالا را نگه دارید.
اجرا را یک‌بار به ترتیب ببینید. Java از main شروع می‌کند. صدای down(3) با n برابر 3 وارد می‌شود. از 0 بزرگ‌تر است، پس متد 3 را چاپ می‌کند، بعد down(2) را صدا می‌زند. صدای دوم 2 را چاپ می‌کند، بعد down(1) را صدا می‌زند. صدای سوم 1 را چاپ می‌کند، بعد down(0) را صدا می‌زند. صدای با 0 به n <= 0 می‌خورد و بدون چاپ برمی‌گردد. زنجیره تمام می‌شود. صفحه همان سه خط چاپ‌شده را نگه می‌دارد.
هر کدام از این صداها یک گذر جدا از همان متن متد است. گذر اول هنوز بعد از شروع down(2) کاری برای تمام شدن دارد — یعنی وقتی صدای درونی برگردد، خودش هم تمام شود. چهار نام متد جدا نمی‌نویسید. یک متد می‌نویسید و می‌گذارید آرگومان کوچک‌تر پیشرفت به‌سوی توقف را حمل کند.
اگر شروع را به down(2); عوض کنید، صفحه باید 2 بعد 1 نشان دهد. بدنهٔ متد همان است؛ فقط آرگومان اول عوض می‌شود، پس زنجیره کوتاه‌تر است. شروع با down(4); باید چهار خط نشان دهد: 4، 3، 2، 1. باز هم بدنه دست نمی‌خورد؛ فقط main مقدار اول را برمی‌گزیند.

توقف را اول بگذارید

توقف باید قبل از چاپ و قبل از خودصدا زدن چک شود. اگر اول چاپ کنید و هرگز n را آزمایش نکنید، یا همیشه down(n) را با همان مقدار صدا بزنید، برنامه تمام نمی‌شود. روی این شکل مبتدی بلوک if (n <= 0) را بالای متد نگه دارید.

stop checked before print

java
public class Ladder {
    public static void main(String[] args) {
        down(2);
    }

    static void down(int n) {
        if (n <= 0) {
            return;
        }
        System.out.println(n);
        down(n - 1);
    }
}

دوباره کامپایل و اجرا کنید: javac Ladder.java، بعد java Ladder. صفحه 2 بعد 1 نشان می‌دهد. توقف هنوز وقتی n به 0 برسد زنجیره را تمام می‌کند. نوشتن down(n) به‌جای down(n - 1) همان عدد را بارها می‌فرستد. آن‌وقت برنامه ممکن است تا وقتی سیستم متوقفش کند اجرا شود. آرگومان کوچک‌تر بخشی از ایده است: هر صدا باید به‌سوی توقف حرکت کند.
توقف را درِ خروجی بدانید. چاپ کار همین گام است. خودصدا زدن گام بعدی است. اگر در نباشد، هر گام گام دیگری را بدون پایان باز می‌کند. اگر گام بعدی همان n را به کار ببرد، هرگز به‌سوی در راه نمی‌روید. هر دو اشتباه در سورس فرق دارند، ولی روی این شکل مبتدی هر دو تمیز تمام نمی‌شوند.

زنجیرهٔ صدا کنار صفحه

یک صدای شروع را کنار خط‌هایی که می‌سازد بخوانید. هر ردیف یک ورود به down است که هنوز چاپ می‌کند.

📊 down call chain for down(3)

صدا مقدار n خط صفحه
اول down(3) 3 3
بعد down(2) 2 2
بعد down(1) 1 1
بعد down(0) 0 (بدون خط — توقف)

اشتباه رایج این است که توقف را نگذارید. آن‌وقت هر صدا چاپ می‌کند و دوباره صدا می‌زند تا بی‌پایان. اشتباه دیگر چاپ بعد از خودصدا زدن است به‌جای قبل از آن. روی این صفحه چاپ اول است، پس صفحه شمارش معکوس نشان می‌دهد. اگر println را زیر down(n - 1) ببرید، ترتیب خط‌ها عوض می‌شود — برای شمارش معکوس همین صفحه، چاپ را بالای خودصدا زدن نگه دارید.
محدودهٔ نام صفحهٔ قبل هنوز کمی مهم است: n هر صدا پارامتر همان صداست. وقتی صدای درونی اجرا می‌شود، n صدای بیرونی خودش را بازنویسی نمی‌کند. صدای درونی n جدا دارد. وقتی صدای درونی برگردد، صدای بیرونی از خط بعد از خودصدا زدن ادامه می‌دهد — و روی این صفحه آن یعنی پایان متد.
یک دموی باقی‌ماندهٔ Gate با mark(4) ممکن است در همان فایل بماند و اگر main هنوز mark صدا بزند صفحه را گیج کند. main را تا down(3); یا down(2); خلوت کنید تا این صفحه را یاد بگیرید. down را داخل آکولاد main تو در تو ننویسید. متدها داخل کلاس، کنار main می‌نشینند.
نوشتن System.out.println("down"); در main کلمهٔ down را چاپ می‌کند. زنجیره را شروع نمی‌کند. وقتی سه خط شمارش معکوس می‌خواهید، down(3); را نگه دارید.

یک شکل دیگر: توقف چیزی چاپ نمی‌کند

دیدید که صدای با 0 آرام برمی‌گردد. می‌توانید با مقدار شروع 1 هم تمرین کنید. صفحه باید یک خط نشان دهد: 1. بعد صدای بعدی down(0) است که می‌ایستد.

down starting at one

java
public class Ladder {
    public static void main(String[] args) {
        down(1);
    }

    static void down(int n) {
        if (n <= 0) {
            return;
        }
        System.out.println(n);
        down(n - 1);
    }
}

بعد از javac Ladder.java و java Ladder، صفحه یک خط نشان می‌دهد: 1. همان بدنهٔ متد down(3) و down(2) و down(1) را پوشش می‌دهد. فقط آرگومان اول در main عوض می‌شود. برای این صفحهٔ مبتدی همین کافی است. ایده‌های عمیق‌تر مثل برگرداندن مجموع از بازگشت برای دوره‌های بعد می‌ماند؛ اینجا هدف خودصدا زدن، آرگومان کوچک‌تر، و توقف است.
اگر صفحه هیچ چیزی نشان نداد، ببینید آیا main هنوز چیز دیگری صدا می‌زند، یا آزمایش توقف اشتباه است — مثلاً if (n >= 0) وقتی با n مثبت شروع کنید قبل از هر چاپی می‌ایستد. n <= 0 را خروج آرام نگه دارید، و در main شروع مثبت بگذارید تا دست‌کم یک خط دیده شود.

قبل از classes

می‌توانید down(int n) بنویسید، وقتی n صفر یا کمتر است بایستید، n را چاپ کنید، بعد down(n - 1) را صدا بزنید. از main یک صدا کل زنجیره را شروع می‌کند. صفحه خط‌های شمارش معکوس را نشان می‌دهد. متدی که هرگز به‌سوی توقف حرکت نکند تمام نمی‌شود. صفحهٔ بعد classes است؛ آنجا ساختن نوع‌ها با فیلد را فراتر از این صفحات متد static شروع می‌کنید.

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
5
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود