2016-05-12 59 views
-2

從if和else.Calee遞歸調用相同的方法獲取意外的輸出(如您可以從sysout中看到的那樣)。 預期輸出:4從if和else遞歸調用相同的方法。獲取意外輸出

調試代碼,看看發生了什麼。但不能理解太多。請大家幫幫忙

public class GetSquares { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     String rectDimension="5X3"; 
     int noOfSquares=0; 
     int noOfSq=getNoofSquares(rectDimension,noOfSquares); 
     System.out.println(noOfSq); 
    } 

    public static int getNoofSquares(String rectDimension,int noOfSquares){ 

     int length=Integer.parseInt(rectDimension.split("X")[0]); 
     int breadth=Integer.parseInt(rectDimension.split("X")[1]); 


     if(length<breadth){ 
      rectDimension=String.valueOf(breadth-length)+"X"+length; 
      ++noOfSquares; 
      getNoofSquares(rectDimension, noOfSquares); 
     }else if(length>breadth){ 
      rectDimension=String.valueOf(length-breadth)+"X"+breadth; 
      ++noOfSquares; 
      getNoofSquares(rectDimension, noOfSquares); 
     }else { 
      noOfSquares=noOfSquares+1; 
      System.out.println(noOfSquares); 
      return noOfSquares; 
     } 

     return noOfSquares; 



    } 
} 
+2

實際輸出有兩行:'4'和'1'。我不知道你在做什麼,你在期待什麼以及你認爲什麼是錯的。 –

+0

我想返回agiven矩形中最大的可能正方形。例如:矩形5X3。它有方形3 * 3,2 * 2,1 * 1,1 * 1。共4個方塊。我在getNoofSquares方法的else語句中獲得了輸出(有一個可以打印4的sysout)。但是,當我去Calee方法,我得到1作爲輸出,而不是4 –

回答

0

你不是從法getNoofSquare()在遞歸調用拿着返回值, 得到像

noOfSquares= getNoofSquares(rectDimension, noOfSquares); 
+0

我不想保留輸出。我只想通過一個方法增加noOfSquares並調用相同的方法 –

+0

參數在靜態方法中每次調用方法時都會初始化。所以如果你想增加noOfSquares變量,那麼使它成爲類成員。通過聲明它是靜態的。 –

0

你的問題的值是原始類型的Java是按值傳遞,而不是通過參考。

public static void increment(int x) { 
    x++; 
} 

public static void main(String... a) { 
    int x = 0; 
    increment(x); 
    System.out.println(x); 
} 

此代碼將打印0

如果你想有一個「輸出參數」,它必須是可變的,但不是int。你將不得不創建一個類,是整數持有人:

public class MutableInteger { 

    private int value = 0; 

    public void increment() { 
     value++; 
    } 

    public int getValue() { 
     return value; 
    } 

} 

那麼你的代碼應該是這樣的:

// SOLUTION 1 
public class GetSquares { 

    public static void main(String[] args) { 
     String rectDimension = "5X3"; 
     MutableInteger noOfSq = new MutableInteger(); 
     getNoofSquares(rectDimension, noOfSq); 
     System.out.println(noOfSq.getValue()); 
    } 

    public static void getNoofSquares(String rectDimension, MutableInteger noOfSquares) { 

     int length = Integer.parseInt(rectDimension.split("X")[0]); 
     int breadth = Integer.parseInt(rectDimension.split("X")[1]); 

     noOfSquares.increment(); 

     if (length < breadth) { 
      rectDimension = String.valueOf(breadth - length) + "X" + length; 
      getNoofSquares(rectDimension, noOfSquares); 
     } else if (length > breadth) { 
      rectDimension = String.valueOf(length - breadth) + "X" + breadth; 
      getNoofSquares(rectDimension, noOfSquares); 
     } 
    } 

} 

另一種方法是隻使用返回值來返回結果:

// SOLUTION 2 
public class GetSquares { 

    public static void main(String[] args) { 
     String rectDimension = "5X3"; 
     int noOfSq = getNoofSquares(rectDimension); 
     System.out.println(noOfSq); 
    } 

    public static int getNoofSquares(String rectDimension) { 
     int length = Integer.parseInt(rectDimension.split("X")[0]); 
     int breadth = Integer.parseInt(rectDimension.split("X")[1]); 

     if (length < breadth) { 
      rectDimension = String.valueOf(breadth - length) + "X" + length; 
      return 1 + getNoofSquares(rectDimension); 
     } else if (length > breadth) { 
      rectDimension = String.valueOf(length - breadth) + "X" + breadth; 
      return 1 + getNoofSquares(rectDimension); 
     } else { 
      return 1; 
     } 
    } 

} 

此外,而不是做字符串解析/分割/建築,我會建議只是有長度和寬度的兩個int參數:

// SOLUTION 2 (cleaned) 
public class GetSquares { 

    public static void main(String[] args) { 
     String rectDimension = "5X3"; 

     int length = Integer.parseInt(rectDimension.split("X")[0]); 
     int breadth = Integer.parseInt(rectDimension.split("X")[1]); 

     int noOfSq = getNoofSquares(length, breadth); 
     System.out.println(noOfSq); 
    } 

    public static int getNoofSquares(int length, int breadth) { 
     if (length < breadth) { 
      return 1 + getNoofSquares(breadth - length, length); 
     } else if (length > breadth) { 
      return 1 + getNoofSquares(length - breadth, breadth); 
     } else { 
      return 1; 
     } 
    } 

} 
0

Java是通過價值。您正在增加一個局部變量,並且您沒有對從遞歸返回的值做任何事情。

既然你是不是做anyhthing之後,但返回你可以很出色地完成:

public class GetSquares { 

    public static void main(String[] args) { 
     String rectDimension = args.length > 0 ? args[0] : "5X3"; 
     System.out.println("Number of squares from " + rectDimension 
      + " is " + getNoofSquares(rectDimension)); 
    } 

    public static int getNoofSquares(String rectDimension){ 
     String parts[] = rectDimension.split("X"); 
     int length=Integer.parseInt(parts[0]); 
     int breadth=Integer.parseInt(parts[1]); 
     return getNoofSquares(length, breadth, 0); 
    } 

    public static int getNoofSquares(int length, int breadth, int noOfSquares){ 
     if (length < breadth) { 
      return getNoofSquares(breadth-length, length, noOfSquares+1); 
     } else if (length > breadth) { 
      return getNoofSquares(length-breadth, breadth, noOfSquares+1); 
     } else { 
      return noOfSquares+1; 
     } 
    } 
} 

我一直在你的蓄電池所以現在是尾遞歸。儘管如此,Java還沒有TCO。