递归打印出电话号码中的可能单词

时间:2013-11-17 08:12:03

标签: java recursion combinatorics

我遇到这个编程任务有问题......(这是作业) 该程序的目标是查找输入文件中的所有7位数电话号码并找到它们可能出现的单词(例如1 = a / b / c ...),然后在文本中查找它们文件以查看它们是否是正确的单词。到目前为止,我的程序似乎运行正常,当我在我的递归函数中放入println语句时,我看到了我期望的所有结果。然而问题是,我看到一个打印的单词,ex“cat”,即使它存在于查找文件中也不打印它。对不起,如果这是一个不好的描述。我附上了我的程序代码。

谢谢, 附:我看过类似于我的问题的其他线程,但他们没有帮助。

import java.io.*;
import java.util.*;

public class PhoneWords
{
public static void main(String[] args) throws IOException
{
    PrintWriter fstream = new PrintWriter(new FileWriter("output.txt"));
    Scanner numbers = new Scanner(new File("telephones.txt"));
    Scanner words = new Scanner(new File("words.txt"));
    String current = "";

    while(numbers.hasNext())
    {
        current = numbers.next().toLowerCase();
        current = current.replaceAll("-", "");

        fstream.println(toWordString("", current, words));
        System.out.println(toWordString("", current, words));

    }

    fstream.close();
    numbers.close();
    words.close();
}




public static String toWordString(String word, String number, Scanner ifstream)
{
    char[] guess = new char[3];

    if(number.length() == 0)
    {
        if(isFound(word, ifstream))
        {
            System.out.println(word);
                return number + word;
        }

    }

    else
    {
        guess = getPossibleLetters(number.charAt(0));
        number = number.substring(1);

        toWordString(word + guess[0], number, ifstream);
        toWordString(word + guess[1], number, ifstream);
        toWordString(word + guess[2], number, ifstream);
    }

    return number + ": None";
}

public static boolean isFound(String word, Scanner ifstream)
{
    String current = "";
    //System.out.println(word);
    while(ifstream.hasNext())
    {
        current = ifstream.next();

        if(current.equalsIgnoreCase(word))
            return true;
    }

    return false;
}

public static char[] getPossibleLetters(char c)
{
    switch(c)
    {
        case '0':
        case '1':
            throw new NumberFormatException("Digit cannot be 0 or 1");
        case '2':
            return new char[] {'a', 'b', 'c'};
        case '3':
            return new char[] {'d', 'e', 'f'};
        case '4':
            return new char[] {'g', 'h', 'i'};
        case '5':
            return new char[] {'j', 'k', 'l'};
        case '6':
            return new char[] {'m', 'n', 'o'};
        case '7':
            return new char[] {'p', 'r', 's'};
        case '8':
            return new char[] {'t', 'u', 'v'};
        default:
            return new char[] {'w', 'x', 'y'};
    }
}

}

1 个答案:

答案 0 :(得分:1)

我认为您的代码中存在以下问题:

1,你看到打印出的单词但是在输出文件中没有看到它的原因是你没有处理递归调用toWordString函数的返回值,返回值是以下块返回上层toWordString而不是main函数:

if(isFound(word, ifstream))
{
    System.out.println(word);
    return number + word;
}

你应该处理对toWordString函数的3次递归调用的返回值,或者为toWordString添加一个额外的参数(如List)来保存递归调用之间的返回结果。

2,您不应该使用Scanner ifstream作为toWordString的参数,对toWordString的递归调用使用相同的扫描程序对象并首次调用isFound将迭代扫描仪中的所有令牌,对isFound的进一步调用将始终返回false

您最好在main函数中将所有单词读入集合中,然后将集合传递给toWordString