繁体   English   中英

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

[英]Recursive method: why do I need return statement?

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

我的问题是:在第一个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;
}

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

Java函数的定义是它总是返回一个值...即使它是递归中最深点的链,最后将true或false带到顶部。

如果你错过了return palChecker ,那么除非s的长度为0或1,否则它永远不会返回true 。因为当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

如果你可以用显式的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;
    }
}

如果没有这个return语句,你的palChecker几乎总会返回false。

考虑一下,函数确实会以递归方式执行,但最后,它只是返回一个你不会使用truefalse值,然后程序将返回调用堆栈,只返回false最终使你的方法总是返回false(除非s.length()==1 || s.length()==0在第一次调用时为真)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM