【问题标题】:need assistance with recursive method in Java在 Java 中需要递归方法的帮助
【发布时间】:2012-04-29 18:33:07
【问题描述】:

我对编程有点陌生,需要帮助执行递归方法。我有一个方法可以在二维数组中选择一个随机空间,然后我想检查空间是否空闲。如果空间是空闲的,我想要使用该空间,但如果不是,我想在二维数组中选择一个新的随机空间。谢谢

import java.io.* ;
import java.util.ArrayList ;
public class WordSearchPuzzle
{
    private char[][] puzzle ;
    private ArrayList<String> puzzleWords ;
    private int letterCount = 0 ;
    private int gridDimensions;

    public WordSearchPuzzle(ArrayList<String> userSpecifiedWords)
    {
        this.puzzleWords = userSpecifiedWords ;

    }

    private void createPuzzleGrid()
    {
        int i, itemLength;
        String item;
        for (i = 0; i < puzzleWords.size(); i++) {
            item = puzzleWords.get(i);
            itemLength = item.length();
            letterCount = letterCount + itemLength;
        }
        gridDimensions = letterCount * 2;
        puzzle = new char[gridDimensions][gridDimensions] ;
    }

    private void generateWordSearchPuzzle()
    {

    }


    public void firstSpace(String Word) 
        {  
            int row, column;
            row = (int)(Math.random() * gridDimensions +1);
            column = (int)(Math.random() * gridDimensions +1);
            if(puzzle[row][column] != ' '){
                firstSpace();
            }
        }

【问题讨论】:

  • 你有什么问题?
  • 这听起来不是一个问题,递归是一个很好的,甚至几乎是体面的解决方案。只需做一个while循环选择一个随机空间并检查它是否是空闲的。
  • 有什么问题,你的退出条件是什么?你定义了你的界限吗?
  • 编译时不断收到此错误:WordSearchPuzzle 类中的方法 firstSpace 无法应用于给定类型;必需:java.lang.String 找到:无参数原因:实际参数列表和形式参数列表的长度不同
  • 感谢 mads 的建议,我已经有循环来检查我的位置是否有剩余空间Word 方法

标签: java recursion arraylist multidimensional-array


【解决方案1】:

我认为在您的索引计算中添加 1 是不必要的,并且可能会导致数组越界异常。不过,这取决于您对 gridDimensions 的定义。

您在 cmets 中指定的问题是因为 Java 编译器试图找到一个名为“void firstSpace()”的方法,这是与“void firstSpace(String word)”不同的方法。

public void firstSpace(String word) 
{  
    int row, column;

    // No need to add 1, Java arrays are accessed with the first index 
    // being 0. Math.random() returns from 0 up to but not including 1.0.
    // e.g. array size = 50, min index = 0, max index = 49
    // Lets say you get very close to 1 e.g. 0.9999, then 
    // 0.9999 * 50 = 49.995 (after integer truncating you have 49)
    row = (int)(Math.random() * gridDimensions);
    column = (int)(Math.random() * gridDimensions);

    if(puzzle[row][column] != ' ') { 
        // If this element is not "empty" then run the method again 
        // using recursion. null might be a better choice to compare
        // to depending on how you initialized the array.
        firstSpace(word);
    } else {
        // Otherwise we're finished and we can set the array element
        // to the new word.

        // (Assumed post condition (you might want to do something else once you
        // find a blank index))
        puzzle[row][column] = word;
    }
}

【讨论】:

  • 感谢 Simon 的帮助,我将编辑代码以显示到目前为止的完整代码
  • 好的,无需在行列计算中添加 +1。我已经编辑了代码并在 cmets 中解释了原因,希望它是可以理解的。您发布的新代码与我的预期有很大不同。我认为这是一个“n x n”字符串数组,您有一个“n x n”字符数组,它本质上是一个“n x 1”字符串数组。
  • 感谢一百万的帮助,最后一个问题,当递归部分的空格不明确时,我会提示输入一个新单词,我有点不确定你为什么把这部分放在else 部分中的代码拼图[row][column] = word;因为它们是不兼容的类型
  • 没有。 'else' 用于程序是否找到随机点。如果它确实找到了一个空的随机点,那么它将被设置为您传递给函数的单词(假设会发生一些有用的事情)。如果(不是计算机)想选择一个新的随机空格来设置单词,那么你根本不会使用递归,你只需返回true或false来告诉你空间被占用的方法的调用者。然后,该方法的调用者可以对该结果执行某些操作。
【解决方案2】:

您在 cmets 中提到的具体问题是因为 firstSpace 方法需要有一个字符串作为参数。你应该使用:

firstSpace(word);

另外请注意,此方法当前不返回任何内容,因此您无法知道它选择了哪个空间。

【讨论】:

  • 谢谢 Jim 我只有两个问题 1) 是否会在每次进入递归函数时提示我输入一个新单词以及 2) 我可以做一个}else{ return row && column; 吗? ?
  • @user1323808 不,它只会使用传入第一个递归函数调用的同一个词。要返回两个项目,你必须创建一个包含它们的对象,但你是对的,你可以在 else 中返回它们(你还想在 if 的第一部分使用 return firstSpace(word);)。
最近更新 更多