簡體   English   中英

將帶有continue語句的for循環轉換為while循環

[英]Converting a for-loop with continue statement to while-loop

我正在進行一項練習,其中基於for循環的一小段代碼被轉換為使用while循環執行相同的操作。 目的轉換是錯誤的,如下所示:

int sum = 0;

    for (int i = 0; i < 4; i++) {
        if (i % 3 == 0) continue;
        sum += i;   
    }
System.out.println(sum); // prints 3

這轉換為:

int i = 0, sum = 0;

        while (i < 4) {
            if (i % 3 == 0) continue;
            sum += i;   
            i++;    
        }
System.out.println(sum); // will not print

在練習中,我被要求解釋為什么轉換是錯誤的然后修復它。 我的想法是:

  1. I = 0的初始值,這將觸發立即繼續進入將循環后,因為(0%3 == 0)將使if語句真。 只要初始值為0,這將執行循環,以便跳過它無數次。 我嘗試更改i = 1的初始值,但是打印了noe sum。 然后我嘗試在執行if語句之前遞增i ,程序現在打印總和7.這里的問題是; 如果i在if語句之后遞增,為什么程序不打印,即使i = 1的初始值表明(在我的腦海中)該程序應該正常運行?

  2. 我為每個程序制作了一個表來比較求和。

for-loop版本:

i = 0,sum + = i未執行(繼續),i ++

i = 1,sum = 1,i ++

i = 2,sum = 3,i ++

i = 3,sum + = i未執行(繼續),i ++

i = 4,i <4 false,循環停止

while循環版本:

i = 0,i ++,sum = 1

i = 1,i ++,sum = 3

i = 2,i ++,sum + =我沒有預成型(續)

i = 3,i ++,sum = 7

i = 4,i <4 false,循環停止

while循環中 ,sum + = i比for循環更多地執行 這是將for循環轉換為while循環的正確方法嗎?

int i = 0, sum = 0;

        while (i < 3) {
            i++;
            if (i % 3 == 0) continue;
            sum += i;           
        }

        System.out.println(sum);

你的1專注於它是初始值,但這不是重點。 的一點是, i當從未遞增i % 3 == 0為真,而不是0是初始值。 所以while循環永遠循環。

你的2沒有任何意義: while版本將永遠循環,永遠不會總結任何東西。

這是將for循環轉換為while循環的正確方法嗎?

不,你在錯誤的時間遞增i

想想for循環是如何工作的:

  1. 初始化 - 首先,它將變量設置為第一個表達式中的值。

  2. 測試 - 然后使用第二個表達式測試值。

  3. 執行 - 如果值為true,則執行循環體。

  4. 增量 - 當循環體完成時,它執行第三個(增量)表達式。 請注意,這是循環體之后。

讓你的while循環執行for循環正在做的事情。 (我故意為你做這個;這是一個學習練習。我會注意到轉換for循環的最佳方法不會continue使用。“最好,”當然是主觀的。)

在練習中,我被要求解釋為什么轉換是錯誤的然后修復它

轉換是錯誤的,因為當你達到模3等於0的i值時(在這種情況下是第一次迭代),你將跳到下一次迭代並重新驗證。 但是,由於您在不增加i情況下直接跳過,因此您將重新驗證相同的條件並重新驗證ad-infinitum

你可以通過擺脫continue和否定條件輕松地解決它:

while (i < 4) {
    if (i % 3 != 0)
        sum += i;

    i++;    
}

問題給出的for循環如果轉換為普通英語 ,則表示從0到3的 總和並排除3的 所有倍數 (0 + 1 + 2 = 3)

   for (int i = 0; i < 4; i++) {
        if (i % 3 == 0) continue;
        sum += i;   
    }

所以現在,我們問自己,我們如何將0加到x並使用while循環排除所有3的倍數。 我們將在不查看原始for循環的情況下執行此操作。 有時這樣做更容易,因為我們已經知道for循環的意圖

總結從0到3的數字:

int i = 0;
while(i < 4){
    sum += i;
    i++;
}

要將0到3之間的數字相加,不包括3的倍數:

int i = 0;
while(i < 4){
    if(i % 3 != 0)
        sum += i;
    i++;
}

要將0到3之間的數字相加,不包括3的倍數(使用continue):

int i = 0;
while(i < 4){
    if(i % 3 == 0){
        i++;       //Remember to increase i before continue
        continue;
    }
    else
        sum += i;
    i++;
}

continue ,將跳過它下面的所有語句,你必須記住在調用continue之前做一個增量i++ 由於你現在已經分為2個條件,因此將會有另一個i++

根據while循環邏輯,變量i的增量是有條件的,而for循環則是無條件的。 要使增量邏輯均勻,您應該在兩種情況下遞增。

我認為正確的轉換將是 -

int i = 0, sum = 0;

while (i < 4) {
    if (i % 3 == 0) {i++;continue;}
    sum += i;   
    i++;   
}
System.out.println(sum);

通常,增量將在while循環的最后一行。 但是,在這個“等待發生的災難”代碼中,有一個條件是跳轉到while塊的末尾而不增加i。 如果依靠i遞增,請確保它始終在任何迭代上執行。 而且,最后,因為你希望它第一次迭代。

    while (i < 4) {
        if (i % 3 == 0) {
          // skip!
        } else {
          sum += i;   
        }
        i++;    
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM