Java &引用;“无法到达的语句”;在布尔递归中

Java &引用;“无法到达的语句”;在布尔递归中,java,string,recursion,Java,String,Recursion,我需要为一个类编写一个简短的递归程序,检查一个字符串-t是否是另一个字符串-s的转换。它只需要检查s中的每个字符是否也在t中。 例如: “sddbs”不是“sdb”的变换 “sddb”是“sddb”的变换 但是。。代码没有按预期工作。代码最后一行中的“不可访问语句”。原因很简单: 无法执行此行: return isTrans(s.substring(1), t); 为什么 如果,则返回一个。(t.indexOf(s.charAt(0))!=-1),如果不满足,则返回另一个。原因很简单: 无法

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

“sddbs”不是“sdb”的变换

“sddb”是“sddb”的变换


但是。。代码没有按预期工作。代码最后一行中的“不可访问语句”。

原因很简单:

无法执行此行:

return isTrans(s.substring(1), t); 
为什么


如果,则返回一个(t.indexOf(s.charAt(0))!=-1),如果不满足,则返回另一个

原因很简单:

无法执行此行:

return isTrans(s.substring(1), t); 
为什么


如果
,则返回(t.indexOf(s.charAt(0))!=-1),如果不满足,则返回另一个

这是因为排除中间法则。您可以将
返回
视为
退出功能

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);     
}

如果
条件
为真,则
返回真
,如果为假,则
返回假
。否则,您将递归调用<没有别的办法。

这是因为排除中间法则。您可以将
返回
视为
退出功能

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);     
}

如果
条件
为真,则
返回真
,如果为假,则
返回假
。否则,您将递归调用没有其他方法。

您最终的
返回
语句是不可访问的,因为您的方法体包含
返回
语句,用于
if
else
条件,因此确保永远不会到达最后的
返回
语句

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

public static boolean isTrans (String s, String t) 
{
    if (t.indexOf(s) > -1)
        return true;
    else 
        return false;    
}
编辑: 根据@Holger的建议,您可以避免不必要的if-else,并将代码替换为:

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
}

最后的
return
语句不可访问,因为方法主体包含
if
else
条件的
return
语句,因此确保永远不会到达最后的
return
语句

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

public static boolean isTrans (String s, String t) 
{
    if (t.indexOf(s) > -1)
        return true;
    else 
        return false;    
}
编辑: 根据@Holger的建议,您可以避免不必要的if-else,并将代码替换为:

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();
    }

}

根据递归方法,一旦输入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();
    }

}

因为它是……无法到达的。在这一行之前你不可能不返回。编译错误说明了一切,你还需要什么???你所拥有的(if/else)相当于
return t.indexOf(s.charAt(0))!=-1
BTW,“sddb”的真正含义是“sddb”的转换,而不是“sdb”?我投票结束这个问题,因为它是家庭作业,因为它……无法实现。在这一行之前你不可能不返回。编译错误说明了一切,你还需要什么???你所拥有的(if/else)相当于
return t.indexOf(s.charAt(0))!=-1
BTW,到底是什么让“sddb”变成了“sddb”而不是“sdb”?我投票决定把这个问题作为离题题题来结束,因为它是家庭作业……如果(条件)返回true,你为什么还要写
;否则返回false而不是仅
返回条件?是的,你是对的,但我只是想让我的程序看起来像OP的程序,因为他/她似乎是个初学者。我可以写
返回t.contains(s)
是最简单的解决方案。这正是为什么你应该在它成为习惯之前,将OP指向这样一个
if
语句的无稽之谈……为什么你还在写
if(condition)return true;否则返回false而不是仅
返回条件?是的,你是对的,但我只是想让我的程序看起来像OP的程序,因为他/她似乎是个初学者。我可以写
返回t.contains(s)
是最简单的解决方案。这正是为什么你应该在这种
if
语句成为习惯之前,将OP指向这种毫无意义的语句的原因。