9

我正在学习 Java 并坚持一个自测练习,编写一个递归函数,向后打印一个字符串......

我了解编译器错误,但我不确定该怎么做。

我的代码...

class Back {
    void Backwards(String s) {
            if (s.length = 0) { 
                    System.out.println();
                    return;
            }
            System.out.print(s.charAt(s.length));
            s = s.substring(0, s.length-1);
            Backwards(s);
    }
}

class RTest {
    public static void main(String args[]) {
            Back b;
            b.Backwards("A STRING");
    }

}

编译器输出...

john@fekete:~/javadev$ javac Recur.java 
Recur.java:3: error: cannot find symbol
    if (s.length = 0) { 
         ^
  symbol:   variable length
  location: variable s of type String
Recur.java:7: error: cannot find symbol
    System.out.print(s.charAt(s.length));
                               ^
  symbol:   variable length
  location: variable s of type String
Recur.java:8: error: cannot find symbol
    s = s.substring(0, s.length-1);
                        ^
  symbol:   variable length
  location: variable s of type String
3 errors

完成代码...

class Back {
    static void backwards(String s) {
            if (s.length() == 0) {
                    System.out.println();
                    return;
            }
            System.out.print(s.charAt(s.length()-1));
            s = s.substring(0, s.length()-1);
            backwards(s);
    }
}

class RTest {
    public static void main(String args[]) {

            Back.backwards("A STRING");
    }
}   
4

7 回答 7

8

像这样写:

s.length() == 0 // it's a method, not an attribute
于 2012-10-28T18:29:33.370 回答
2

一些一般的“良好编码”建议:

  • 类名应该代表一个“事物”,通常一个类名是一个名词(例如“StringTool”)
  • 方法应该代表一个动作,通常方法名是一个动词(例如“reverse”)
  • 参数和变量名称应该是有意义的并描述它们所代表的内容。
  • 您不应该重新分配方法参数,因为它可能会产生误导。
  • 一个方法应该有一个确切的责任(所以不反转和打印一个字符串)。这促进了清晰度和重用性。

我已将这些建议应用于您完成的代码,见下文:

public class StringTool {

    public static String reverse(String source) {

        // stop condition of the recursion
        if (source.isEmpty()) {
            return "";
        }

        int lastPosition = source.length() - 1;
        String lastCharacter = source.charAt(lastPosition);
        String restOfSource = source.substring(0, lastPosition);

        // place the last character at the beginning and reverse the rest 
        // of the source recursively
        return lastCharacter + reverse(restOfSource);
    }

    // test method
    public static void main(String args[]) {
        System.out.println(reverse("A STRING"));
    }

} 
于 2012-10-28T19:49:58.923 回答
1

在您的 if 语句中,您将 0 分配给 s.length 而不是检查。这样做:

if(s.length()==0)
//rest of your code

另一个故障是s.charAt(s.length())。字符串中第 i 个字符的索引是 (i-1),类似于数组的索引。所以字符串的最后一个字符有 index (s.length()-1)。因此,将那行代码替换为s.charAt(s.length()-1).

于 2012-10-28T18:33:06.050 回答
1

这应该更好地反映您要完成的工作:

class Back {
    void Backwards(String s) {
            if (s.length() == 0) { 
                    System.out.println();
                    return;
            }
            System.out.print(s.charAt(s.length()));
            s = s.substring(0, s.length()-1);
            Backwards(s);
    }
}

public class RTest {
    public static void main(String args[]) {
            Back b = new Back();
            b.Backwards("RAPE APE");
    }
}
  • 长度()是一个函数
  • 比较用途==
  • 您必须实例化 b 才能使用它
于 2012-10-28T18:34:28.340 回答
0

你忘了括号:

s.length()
于 2012-10-28T18:29:41.580 回答
0

length是一个方法,而不是一个属性。你必须这样使用它:

s.length(); // note the use of parens

此外,由于以下情况,修复后您将遇到编译错误:

if (s.length = 0) { 

它应该是

if (s.length == 0) { 

最后,在您的main方法中,b必须实例化变量,使用

Back b = new Back();
于 2012-10-28T18:30:22.050 回答
0

-String我们提供了一个名为而不是字段函数length()length

-如果您使用的是,Array那么它将是length因为Array 有一个且只有一个名为的 Instance 变量length

例如:

s.length() == 0;
于 2012-10-28T18:42:40.340 回答