java作业(递归)

时间:2012-10-17 23:07:04

标签: java recursion

这就是问题:

  

问题我。

     

我们将Pestaina字符串定义如下:

     
      
  1. ab是Pestaina字符串。
  2.   
  3. cbac是Pestaina字符串。
  4.   
  5. 如果S是Pestaina字符串,那么SaS也是如此。
  6.   
  7. 如果U和V是Pestaina字符串,UbV也是如此。
  8.         

    这里a,b,c是常数,S,U,V是变量。在这些规则中,   相同的字母代表相同的字符串。所以,如果S = ab,则规则3   告诉我们abaab是一个Pestaina字符串。在规则4中,U和V代表   爷爷的字符串,但它们可能不同。

         

    编写方法

    public static boolean isPestaina(String in)
    
         

    如果in是Pestaina字符串,则返回true,否则返回false。

这就是我到目前为止只适用于第一条规则的内容,但有些情况不适用于例如“abaaab”:

public class Main {

private static boolean bool = true;
    public static void main(String[] args){

        String pestaina = "abaaab";
        System.out.println(pestaina+" "+pestainaString(pestaina));
    }

    public static boolean pestainaString(String p){

        if(p == null || p.length() == 0 || p.length() == 3) {
            return false;
        }
        if(p.equals("ab")) {
            return true;
        }
        if(p.startsWith("ab")){

            bool = pestainaString(p, 1);
        }else{
            bool = false;
        }
        return bool;
    }

    public static boolean pestainaString(String p, int sign){

        String letter;
        char concat;

        if("".equals(p)){

            return false;
        }


        if(p.length() < 3){

            letter = p;
            concat = ' ';
            p = "";
            pestainaString(p);

        }else if(p.length() == 3 && (!"ab".equals(p.substring(0, 2)) || p.charAt(2) != 'a')){
            letter = p.substring(0, 2);
            concat = p.charAt(2);
            p = "";
            pestainaString(p);
        }else{
            letter = p.substring(0, 2);
            concat = p.charAt(2);
            pestainaString(p.substring(3));
        }

        if(letter.length() == 2 && concat == ' '){
            if(!"ab".equals(letter.trim())){

                bool = false;
                //concat = 'a';
            }

        }else if((!"ab".equals(letter)) || (concat != 'a')){

            bool = false;
        }
        System.out.println(letter +" " + concat);
       return bool;
    }
}

请告诉我我做错了什么。

4 个答案:

答案 0 :(得分:0)

您正在描述Context Free Language,可以将其描述为Context Free Grammer并使用它进行解析。解析这些问题的领域已经得到了广泛的研究,并且有很多资源可供选择。

维基百科页面还讨论了一些algorithms来解析这些内容,具体而言 - 我认为您对Early Parsers

感兴趣

我也相信这种“语言”可以使用push down automaton进行解析(虽然不是100%肯定)。

答案 1 :(得分:0)

我发现了问题,我正在调用错误的方法。

答案 2 :(得分:0)

    public static void main(String[] args) {
        // TODO code application logic here
        String text = "cbacacbac";


        System.out.println("Is \""+ text +"\" a Pestaina string? " + isPestaina(text));



    }

    public static boolean isPestaina(String in) {
        if (in.equals("ab")) {
            return true;
        }
        if (in.equals("cbac")) {
            return true;
        }
        if (in.length() > 3) {
            if ((in.startsWith("ab") || in.startsWith("cbac"))
                    && (in.endsWith("ab") || in.endsWith("cbac"))) {
                return true;
            }
        }
        return false;
    }

答案 3 :(得分:0)

这很有趣。

public boolean isPestaina(String p) {
        Set<String> existingPestainas = new HashSet<String>(Arrays.asList(new String[]{"ab", "cbac"}));
        boolean isP  = false;
        int lengthParsed = 0;
        do {
            if (lengthParsed > 0) {
                //just realized there's a touch more to do here for the a/b
                //connecting rules...I'll leave it as an excersize for the readers.
                if (p.substring(lengthParsed).startsWith("a") ||
                    p.substring(lengthParsed).startsWith("b")) {
                    //good connector.
                    lengthParsed++;
                } else {
                    //bad connector;
                    return false;
                }
            }
            for (String existingP : existingPestainas) {
                if (p.substring(lengthParsed).startsWith(existingP)) {
                    isP = true;
                    lengthParsed += existingP.length();
                }
            }
            if (isP) {
                System.err.println("Adding pestaina: " + p.substring(0, lengthParsed));
                existingPestainas.add(p.substring(0, lengthParsed));
            }
        } while (isP && p.length() >= lengthParsed + 1);
        return isP;
    }