“return”似乎返回旧的变量值

时间:2016-06-02 19:54:27

标签: java return-value

我对此有疑问

public class Palindrom
{
  public static boolean isPalindrom(String text)
  {
    boolean back = true; //return variable
    text = text.replaceAll("\\s","");

    //checking special cases - text.length() = 0 or 1
    if (text.length() <= 1)
    {
      if (text.length() == 0)
      {
        System.out.println("An empty string cannot be a palindrom");
        back = false;
      }
      else
      {
        //checking if the single String-element is a letter
        if (Character.isLetter(text.charAt(0)) == true)
        {
          System.out.println("An single-character string - given that it is a valid word - is always a palindrom");
          back = true;
        }
        else
        {
          System.out.println("The String contains something that isn't a letter 1");
          back = false;
        }
      }
    }
    else
    {
      text = text.toLowerCase();

      //now we always have to check if the first and last element are letters and if they're equal
      if ((Character.isLetter(text.charAt(0)) && Character.isLetter(text.charAt(text.length() - 1))) == true)
      {
        //TEST
        //System.out.println("Checks if letters");

        if (text.charAt(0) == text.charAt(text.length() - 1)) 
        {
          back = true;

          //now we have to the recursive calling
          text = text.substring(1,text.length() - 1);

          //if the cut String has a length = 0, then there is no need to call the method again
          if (text.length() != 0)
          {
            //TEST
            System.out.println("Calls the method again");

            Palindrom.isPalindrom(text);
          }
          //else: we're finished
        }
        else
        {
          back = false;
        }
      }
      else
      {
        System.out.println("The String contains something that isn't a letter 2");
        back = false;
      }
    }

    System.out.println("four");
    System.out.println("back is : " + back);
    System.out.println("five");

    return back;
  }
}

现在如果我用例如方法调用方法“adba”作为文本,然后我将其作为控制台输出:

Calls the method again
four
back is : false
five
four
back is : true
five
true

但事情是“ System.out.println(”后面是:“+后退”“只被调用一次,返回值似乎又变回了前一个。 任何想法该怎么办?

4 个答案:

答案 0 :(得分:1)

除非您有要求(我的意思是,除非您正在尝试学习递归)编写自己的算法,否则以下标准库将解决问题:

public boolean isPlanidrom(String planidrom) {
    StringBuilder original = new StringBuilder(planidrom);
    String reverse = original.reverse().toString();
    return planidrom.equalsIgnoreCase(reverse);
}

示例:

System.out.println(isPlanidrom("Madam"));
System.out.println(isPlanidrom("hello olleh"));

将打印:

true
true

答案 1 :(得分:0)

您需要将递归调用结果分配给外部调用

尝试更改

Palindrom.isPalindrom(text);

back= Palindrom.isPalindrom(text);

答案 2 :(得分:0)

只需更改此行

即可
Palindrom.isPalindrom(text);

到这一行

back= Palindrom.isPalindrom(text);

原因:因为您的代码行不存储back的值并调用自身。保存返回后面变量的值。

答案 3 :(得分:0)

这里的问题是你以递归方式调用这个方法,而方法本身就是打印出结果,这是糟糕的设计。如果要将参数传递给此方法并从命令行调用它,则需要将所有System.out.println()放入main方法中:

public static void main(String[] args){
    System.out.println("four");
    System.out.println("back is : " + Palindrom.isPalindrom(args[0]) );
    System.out.println("five");
}

这样,每次调用时,递归方法都不会运行所有这些print语句。另一个举措是改变第54行

Palindrom.isPalindrom(text);

back =  back && Palindrom.isPalindrom(text);

编辑:不要简单地写

back = Palindrom.isPalindrom(text);

这样可以获得最近一次调用方法的值,而不是所有调用AND的值。

现在你编译你的类并调用

java Palindrom "racecar"
从命令行

,你应该看到你期望的结果:

  

4

     

再次调用该方法

     

再次调用该方法

     

再次调用该方法

     

单字符串 - 假定它是一个有效的单词 - 总是一个palindrom

     

回来是:真的

     

5

那应该让你到达你需要去的地方!

注意:如果您将此作为学校或雇主的代码练习提交,您应该知道向前和向后拼写相同的单词称为“Palindrome”,但拼写不是会影响代码的性能。