繁体   English   中英

布尔递归中的“无法到达的语句”

[英]“unreachable statement” in a boolean recursion

我需要为一个类编写一个简短的递归程序,以检查字符串-t是否是另一个字符串-s的转换 它只需要检查s中的每个字符是否也在t中 例如:

“ sddbs” 不是 “ sdb” 的转换

“ sddbs”是“ sddb” 的转换

public static boolean isTrans (String s, String t) 
{
    if (t.indexOf(s.charAt(0)) != -1)
        return true;
    else 
        return false;
    return isTrans(s.substring(1), t);     
}

而且..代码无法按预期工作。 代码的最后一行中的“ unreachable statement”。

原因很简单:

没有执行此行的方法:

return isTrans(s.substring(1), t); 

为什么?:

如果满足此条件(t.indexOf(s.charAt(0))!= -1) ,并且如果不满足, 则返回。

这是因为排除中间定律 您可以将return视为exit function

public static boolean isTrans (String s, String t) {
    if (condition)
        return true;
    else 
        return false;
    //the condition must have been true or false so the method has already exited.
    return isTrans(s.substring(1), t);     
}

如果condition为true,则return true ;如果为false,则return false 否则,您将递归调用。 没有别的。

您最终return语句是不可访问,因为你的方法体内含有return语句既ifelse条件,因此保证,最后return声明永远不会达到。

但是除此之外,我不明白为什么你需要编写一个递归函数,尽管使用类似方法调用的非递归函数会做同样的事情:

public static boolean isTrans (String s, String t) 
{
    if (t.indexOf(s) > -1)
        return true;
    else 
        return false;    
}

编辑:根据@Holger的建议,您可以避免不必要的情况,并将代码替换为:

public static boolean isTrans (String s, String t) 
{
    return (t.indexOf(s) > -1) //returns true or false just like your if else

}

甚至更短:

public static boolean isTrans (String s, String t) 
{
    return t.contains(s); //internally contains() calls indexOf(), similar to what you are doing
}

根据您的递归方法,一旦输入if条件,它将返回true或false输出。 因此您的代码永远不会到达递归语句。 我想建议我使用递归实现转换程序的方式。

import java.util.Scanner;

public class Recursion {

    static int flag;

    public void isTransformation(String str1, String str2) {

        flag = str2.length();
        char ch1[], ch2[];
        ch1 = str1.toCharArray();
        ch2 = str2.toCharArray();

        if (ch1[0] == ch2[0]) {
            flag--;
            if (flag == 0) {
                System.out.println("Transformation");
                return;
            }
            isTransformation(str1.substring(1), str2.substring(1));
        } else
            System.out.println("Not a Transformation");
    }

    public static void main(String args[]) {
        String str1, str2;
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter string 1: ");
        str1 = sc.nextLine();
        System.out.print("Enter string 2: ");
        str2 = sc.nextLine();
        Recursion r = new Recursion();
        if (str1.length() >= str2.length())
            r.isTransformation(str1, str2);
        else
            r.isTransformation(str2, str1);
        sc.close();
    }

}

暂无
暂无

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

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