2016-02-13 247 views
1

我已經解決了UVa Online Judge上的一個3 * N + 1問題(100),但是這裏有一件事我不明白,但是它與Java有關,我猜測不是與算法本身有關。因此,這裏的代碼:爲什麼變量初始化是多餘的?

private static int maxCycleLength(int lo, int hi) { 
     maxLength = 0; 
     int n = 0; 
     int length = 0; 

    for (int i = lo; i <= hi; i++) { 
     // It's the first time we're computing the cycle length for n 
     if (lengths[i] == 0) { 
      n = i; 
      length = 1; 
      while (n != 1) { 
       if ((n % 2) == 0) { 
        n = n >> 1; 
        length++; 
       } 
       else { 
        n = 3 * n + 1; 
        n = n >> 1; 
        length += 2; 
       } 
      } 
      lengths[i] = length; 
     } 
     // Otherwise we just look it up 
     else 
      length = lengths[i]; 

     // Check if the current cycle length is the maximum 
     if (length > maxLength) 
      maxLength = length; 
    } 
    return maxLength; 

我不明白:我的IDE(IDEA)告訴我,在這段代碼變量的初始化nlength是多餘的,但是,maxLength必須初始化如果我不這樣做,它不會編譯。

爲什麼這麼說? maxLengthnlength有何不同?

+0

順便說一句:以相同的效率一次可以放置int長度;緊接在for後面{'和'int n:i;'' –

回答

2

在嘗試從它們讀取值之前,在所有代碼路徑上,初始化爲nlength。無論發生什麼情況,您最初分配給他們的值都不會被使用,因爲在您需要之前您會用別的東西覆蓋它。

maxLength但會從您之前分配給它一個新值,當你做length > maxLength比較,還是在return閱讀,如果for循環被跳過。由於第一遍沒有價值,因此您需要給它一個初始值來使用。

1

maxLength是不同的,因爲它的值在for循環之外使用。如果從未輸入for循環,則maxLength將永遠不會被初始化(如果您在開始時刪除了初始化),則返回語句將變爲無效。

其他兩個變量(nlength)保證在被訪問之前被分配,即使在刪除初始化初始化之後。它們不在for循環之外訪問,並且在for循環中,ifelse子句都從初始化length開始。 n僅由if cluase初始化,但只能在該子句中進行訪問。