2013-04-10 75 views
0
public class recursion { 

    public static void main(String[] args) 

    { 
     thisclass(0); 
    } 

    public static void thisclass(int z) 
    { 
     int x = 1; 
     int y = 3; 
     if (z==10) 
     { 
      System.out.println("Done"); 
     } 
     else 
     { 
      System.out.println(x/y); 
      x++; 
      y= y+2; 
      thisclass(z++); 
     } 
    } 

} 

我學習遞歸現在,當我到達的thisclass方法else語句,我得到一個錯誤,它打印零的異常量之後。學習遞歸調用錯誤,當類

我希望程序做的就是運行10次,做沿着打印1/3 2/5 3/7線的東西是什麼等

我在哪裏去了?

+0

僅供參考,「thisclass」是一種方法,而不是一類,這是非常令人困惑。 .. – sashkello 2013-04-10 01:47:54

回答

3

有,據我可以告訴(除命名約定)三件事情是造成你的程序,其意不運行。 (1)您正在打印中進行整數除法,所以1/3將爲0(整數中不包含小數)。

解決方案:將int xint y更改爲double xdouble y。 (2)當你將它傳遞給遞歸調用時,你會增加z,這意味着遞歸調用不會看到新值,而是舊值。

解決方法:預增量z thisclass(++z)。 (3)你也可能意味着你的方法之外聲明瞭xy,以便它們的更新值保持不變。 (相反,您只需要打印相同的值10次)。

解決方案:

double x = 1.0; 
double y = 3.0; 
public static void thisclass(int z){ ... 
+0

謝謝大家的迴應,感覺就像一個facepalm時刻,我應該知道這些事情。 – popcornhappy 2013-04-10 01:56:36

2

你得到所有這些0的,因爲你正在做的integer division,它不支持1/3

你應該改變你的代碼中使用float的,這將擺脫0問題。

E.g.

float x = 1.0; 
float y = 3.0; 

你也與每個呼叫的復位y的價值,所以y永遠是3在通話和5在結束的開始。您應該檢查z的值以查看y的值應該是多少。

x的值也可以這麼說。

z正在post-incremented在每次調用,這將導致z價值不是每次調用增加,你應該調用更改爲:

thisclass(++z); 

爲了讓塔值pre-incremented。否則這個電話會永遠持續下去。

此外,請不要打電話給您的方法thisclass是非常混亂。

4

這條線:

thisclass(z++); 

沒有做什麼,你認爲它。它增加'z',然後在z的原始值上調用這個類。這就像做了很多:

int temp = z; 
z = z + 1; 
thisclass(temp); 

您想在這裏使用前增量,而不是後增的:

thisclass(++z); 

是drunkenRabbit和Serdalis已經發布的答案也是有效的。只有在完成所有這些更改之後,它才能正常工作。

1

在else條件下遞增x和y不會影響遞歸調用變量。將遞歸看作是對同一方法的新調用。 因此,當遞歸調用x和y被初始化回到1和3時,可以將x和y作爲參數傳遞,以便更新後的值可以傳遞給每個遞歸調用。有一種方法可以解決這個問題...

希望這有助於:)

+0

@Hydryh - 或者讓'x'和'y'類變量 – 2013-04-10 01:52:03

0

注:

  • 最好還是使用調用遞歸函數本身最初的通話功能,進行初始化

  • 使用static數據,否則他們將不會通過遞歸調用來保存

  • recur(z++)將執行像recur(z)從而導致無限復發,使用recur(z+1)代替

代碼:

public class recursion 
{ 
    public static void main(String[] args) 
    { 
     startRecursive(0); 
    } 

    // using static data 
    private static int x = 1, y = 3; 

    // initial call 
    public static void startRecursive (int initZ) 
    { 
     x = 1; 
     y = 3; 

     // avoid infinite recurrence 
     if (initZ > 10) initZ = 0; 

     recur(initZ); 
    } 

    // recursive function 
    public static void recur(int z) 
    { 
     if (z == 10) 
     { 
      System.out.println("Done"); 
     } 
     else 
     { 
      System.out.println(x/y); 

      x += 1; 
      y += 2; 

      recur(z+1); // z++ will return z 
     } 
    } 
}