递归方法:为什么我需要return语句?

时间:2014-09-07 16:48:56

标签: java recursion palindrome

为了练习递归,我写了一个经典的介绍递归函数 - 一个检查给定字符串是否是回文的。

我的问题是:在第一个if语句中,为什么我必须编写return palChecker(...)而不是palChecker(...)?在我看来,函数应该没有第一个return语句。但是从测试中我知道这不是真的,但我不清楚原因。

(顺便说一句,打印语句就在那里,所以我可以看到测试过程中发生了什么。我喜欢看到每条执行线。)

public static boolean palChecker(String s){
    if ( s.charAt(0)==s.charAt(s.length()-1) && s.length()>1){
        System.out.println(s);
        return palChecker(s.substring(1,s.length()-1)); //why do i need the return here?
    }
    else if (s.length()==1 || s.length()==0){
        System.out.println(s);
        return true;
    }
    return false;
}

3 个答案:

答案 0 :(得分:5)

您需要返回PalChecker最终返回的值。

Java函数的定义是它总是返回一个值......即使它是递归中最深点的链,最终将真或假带到顶端。

答案 1 :(得分:3)

如果您遗漏return palChecker,那么除非true的长度为0或1,否则永远不会返回s。因为当palChecker以递归方式发现答案为true时,没有办法让它把这个发现还给你;当递归返回时,它将转到return false行。

  1. palChecker("ABCBA")执行palChecker("BCB")
  2. palChecker("BCB")执行palChecker("C")
  3. palChecker("C")执行return true
  4. palChecker("BCB")收到true但是如果你错过了return语句,它就不会返回它;它移动到下一行代码return false
  5. palChecker("ABCBA")收到false,但如果您错过了return语句,则会移到下一行代码return false
  6. 最终结果为false
  7. 更清楚的是,您是否可以使用显式else重写。

    public static boolean palChecker(String s){
        if (s.length()==1 || s.length()==0){
            System.out.println(s);
            return true;
        }
        // at this point s.length() > 1
        if (s.charAt(0)==s.charAt(s.length()-1)){
            System.out.println(s);
            return palChecker(s.substring(1,s.length()));
        }
        else { 
            // mismatch
            return false;
        }
    }
    

答案 2 :(得分:-1)

如果没有此return语句,您的palChecker几乎总会返回false。

考虑一下,该函数确实会以递归方式执行,但最后,它只会返回一个 true false wouldn& #39; t ,程序将返回调用堆栈,只返回 false ,最终使您的方法始终返回false(第一次调用时s.length()==1 || s.length()==0为真) )。