Java &引用;“无法到达的语句”;在布尔递归中
我需要为一个类编写一个简短的递归程序,检查一个字符串-t是否是另一个字符串-s的转换。它只需要检查s中的每个字符是否也在t中。 例如: “sddbs”不是“sdb”的变换 “sddb”是“sddb”的变换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),如果不满足,则返回另一个。原因很简单: 无法
但是。。代码没有按预期工作。代码最后一行中的“不可访问语句”。原因很简单: 无法执行此行:
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指向这种毫无意义的语句的原因。