Java 我正在尝试编写一个递归函数,检查一个单词是否与反向单词匹配,但我不确定它是否递归
我真正需要知道的是,我使用的函数是递归的,还是该方法本身没有被调用。 在我的代码中,我有一个helper函数来反转第二个单词,并且我放置了一个toLowerCase,以便能够比较单词,即使有任何随机的大写字母。 这是递归还是只是一个比较两者的函数Java 我正在尝试编写一个递归函数,检查一个单词是否与反向单词匹配,但我不确定它是否递归,java,recursion,Java,Recursion,我真正需要知道的是,我使用的函数是递归的,还是该方法本身没有被调用。 在我的代码中,我有一个helper函数来反转第二个单词,并且我放置了一个toLowerCase,以便能够比较单词,即使有任何随机的大写字母。 这是递归还是只是一个比较两者的函数 import java.util.Scanner; public class isReverse { public static void main(String[] args) { isReverse rev = new i
import java.util.Scanner;
public class isReverse {
public static void main(String[] args) {
isReverse rev = new isReverse();
Scanner in = new Scanner(System.in);
System.out.println("Please enter a word: ");
String a = in.nextLine();
System.out.println("Please Enter a second word to compare: ");
String b = in.nextLine();
System.out.println(rev.isReverse(a, b));
}
String rev = "";
public boolean isReverse(String wordA, String wordB){
String fword = wordA.replaceAll("\\s+", "").toLowerCase();
String clean2 = wordB.replaceAll("\\s+", "").toLowerCase();
String reverse = revString(clean2);
if(fword.length() == 0){
return false;
}
if (fword.equals(reverse)){
return true;
}
if (!reverse.equals(fword)){
return false;
}
else
return isReverse(fword,reverse);
}
public String revString(String sequence) {
String input = sequence;
StringBuilder order = new StringBuilder();
order.append(input);
order = order.reverse();
rev = order.toString();
return rev;
}
}
就您的问题而言,您的代码的行为不像递归函数,因为您的代码没有进入最后一个else条件。要使递归工作,您需要: 基本情况如果没有基本情况,递归将永远持续下去 一个递归的例子,这是你减少原始问题的地方 但我对您的代码的评论是: 如果您正在执行实际的反向逻辑,则不需要使用递归来检查原始字符串和反向字符串是否相同。这纯粹是一个算法问题,因此以下是解决问题的方法: 如果给定输入的长度为1,则相反的长度相同。 其他: 检查字符串的第一个和最后一个字符,如果它们相等,则需要删除这两个字符,并检查字符串的其余部分是否为回文。这是实际的递归步骤。 否则字符串不是回文。
就您的问题而言,您的代码的行为不像递归函数,因为您的代码没有进入最后一个else条件。要使递归工作,您需要: 基本情况如果没有基本情况,递归将永远持续下去 一个递归的例子,这是你减少原始问题的地方 但我对您的代码的评论是: 如果您正在执行实际的反向逻辑,则不需要使用递归来检查原始字符串和反向字符串是否相同。这纯粹是一个算法问题,因此以下是解决问题的方法: 如果给定输入的长度为1,则相反的长度相同。 其他: 检查字符串的第一个和最后一个字符,如果它们相等,则需要删除这两个字符,并检查字符串的其余部分是否为回文。这是实际的递归步骤。 否则字符串不是回文。
实际上这不是一个递归过程。您所需要的只是: 检查两个字符串的长度是否相同 迭代检查第一个字符串中从0到n的字母以及第二个字符串中从n到0的字母。如果它们相等,则转到下一个迭代递归或返回fail otherqwise。
实际上这不是一个递归过程。您所需要的只是: 检查两个字符串的长度是否相同 迭代检查第一个字符串中从0到n的字母以及第二个字符串中从n到0的字母。如果它们相等,则转到下一个迭代递归或返回fail otherqwise。
技术上?好吧,你是从内部调用一个方法,所以,从技术上来说,是的 务实?否。将永远不会调用递归调用部分 你的代码是这样的:我有两个单词。如果两个词相等,停下来做点什么。如果他们不相等,停下来做点什么。否则,将递归 这就是它的分崩离析之处:它永远不会重现——要么单词是相等的,要么它们不是 递归函数的基本思想有三个方面: “function”的javaese方法调用自身。 每次调用自身时,传递的参数都会进入结束状态-它们会变小或趋向于停止值,如0。 在一些边缘情况下,函数不调用自身,而是返回最小/零est输入的答案,这不需要递归,而且非常简单。 你错过了这里的第二部分。这大概就是递归方法所需要的。忘记revString,完全删除它。改为这样做: 如果两个输入都完全为空,则返回true,即3边案例部分。 如果两个输入中的一个为空,而另一个为空,则为false。仍在处理3 如果输入字符串的第一个字符不等于输出字符串的最后一个字符,则为false。仍然是3。 现在删除第一个输入的第一个字符和第二个输入的最后一个字符,现在处理2-通过缩短字符串,无论发生什么,我们都不可避免地朝着结束的方向前进 现在给自己打电话,用这些新剪掉的字符串,将是1。
这将是解决问题的递归方法。它比循环更复杂,但是递归函数通常是这样。从技术上讲?好吧,你是从内部调用一个方法,所以,从技术上来说,是的 务实?否。将永远不会调用递归调用部分 你的代码是这样的:我有两个单词。如果两个词相等,停下来做点什么。如果他们不相等,停下来做点什么。否则,将递归 这就是它崩溃的地方 当前位置它永远不会重现-要么单词相等,要么不相等 递归函数的基本思想有三个方面: “function”的javaese方法调用自身。 每次调用自身时,传递的参数都会进入结束状态-它们会变小或趋向于停止值,如0。 在一些边缘情况下,函数不调用自身,而是返回最小/零est输入的答案,这不需要递归,而且非常简单。 你错过了这里的第二部分。这大概就是递归方法所需要的。忘记revString,完全删除它。改为这样做: 如果两个输入都完全为空,则返回true,即3边案例部分。 如果两个输入中的一个为空,而另一个为空,则为false。仍在处理3 如果输入字符串的第一个字符不等于输出字符串的最后一个字符,则为false。仍然是3。 现在删除第一个输入的第一个字符和第二个输入的最后一个字符,现在处理2-通过缩短字符串,无论发生什么,我们都不可避免地朝着结束的方向前进 现在给自己打电话,用这些新剪掉的字符串,将是1。
这将是解决问题的递归方法。这比循环更复杂,但是递归函数通常都是这样。只是在没有上下文的情况下,将代码发布到家庭作业问题上?请不要这样做。@rzwitserroot是的。那不是个好主意。用注释修复了它。只是在没有上下文的情况下将代码发布到家庭作业问题上?请不要这样做。@rzwitserroot是的。那不是个好主意。用注释修复了它。
// here do not check signature of the public method
public static boolean isReverse(String one, String two) {
return isReverse(one, 0, two, two.length() - 1);
}
// support method has two additional counters to check letters to be equal
private static boolean isReverse(String one, int i, String two, int j) {
if (i == one.length())
return j == -1;
if (j == two.length())
return i == -1;
// if not equal, then strings are not equal
if (one.charAt(i) != two.charAt(j))
return false;
// go to the next recursion to check next letters
return isReverse(one, i + 1, two, j - 1);
}