2012-11-15 129 views
0

我遇到了遞歸Java程序的問題,目前的問題是我不明白爲什麼基本case1如果正在執行。在初始方法調用findPath中,值2和0正在傳遞。 exitRow = 4和cols-1 = 11。所以,我的理解是這個基本情況不應該首先輸入if語句,因爲迷宮中的兩個位置[] []不一樣(迷宮[4] [11]! =迷宮[2] [0])。但這正是它所做的。我明顯錯過了我對if結構的理解,或者我在其他地方遇到了錯誤,並希望得到一些幫助。如果選擇結構

注:我也嘗試過

if (row == exitRow && col == cols-1) 

但最終給我一個堆棧溢出。從我對此理解不多,這意味着我的遞歸不會使我更接近基本情況,或者因爲寫作方式而導致基本情況無法訪問。我假設我的遞歸是基於我已經使用的這個指南http://www.cs.bu.edu/teaching/alg/maze/是正確的。這導致我相信基本案例是問題。

非常感謝。如果當前瓦片是相同類型的出口瓷磚的

private Boolean findPath(int row, int col) 
{ 
    //base case 1 
    if (maze[exitRow][cols-1]==maze[row][col]) 
    { 
     System.out.println("test");//for debugging 
     return true; 
    } 
    //base case 2 
    if (maze[row][col] == '#') 
    { 
     return false; 
    } 

     maze[row][col] = 'O'; 
     System.out.println("test1");//for debugging 
     steps++; 

     //check north 
     if (findPath(row+1,col)==true) 
     { 
     return true; 
     } 
     //check east 
     if (findPath(row,col+1)==true ) 
     { 
      System.out.println("test2"); 
     return true; 
     }  
     //check south 
     if (findPath(row-1,col)== true) 
     { 
     return true; 
     } 
     //check west 
     if (findPath(row,col-1)== true) 
     { 
     return true; 
     } 

     System.out.println(steps); 
     maze[row][col] = '.';//unmark location 

    return false; 
} 
+0

也許基本情況1只在它應該執行時執行?你怎麼知道的? –

+1

你永遠不會測試'O'標記。也許你應該;-) –

+1

另外,「less is more」,所以用'if(findPath(row,col))'替換if(findPath(row,col)== true)' – Bohemian

回答

0
if(maze[exitRow][cols-1]==maze[row][col]) 

將返回true。由於開始和結束都是樓層(.),函數立即返回。堅持:

if (row == exitRow && col == cols-1) 

這是正確的測試,看看你是否已經找到了出口。現在溢出:

您將輸入的瓷磚標記爲O,但如果存在標記,則永遠不會測試該標記,因此您沿着南北偏南行走(此時您註釋) - 南...。既然你已經測試牆(if (maze[row][col] == '#')),測試要麼

  • 什麼,但無人盯防的地板:if (maze[row][col] != '.')
  • 牆壁或標記:if (maze[row][col] == '#' || maze[row][col] == 'O')

需要注意的是,你可以把兩種情況下,同樣,因爲效果是一樣的 - 不要去那裏。

+0

** magnifique!**啊是的,我忘記了它在給定位置的數組內容,而不是座標。 – user1690240