Java - 打破入侵方法并返回值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java - 打破入侵方法并返回值相关的知识,希望对你有一定的参考价值。
大家早上好,
今天是我第一次尝试制作递归方法。就在我认为它可行的时候,我得到了错误;缺少退货声明。这让我感到困惑,因为它在n <1之后确实有一个返回值(Stringbuilder中的总字符串)
这就是我得到的:
import java.util.Scanner;
public class P5_4MethodRepeatString {
public void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("Enter a string followed by the times you want
it repeated:");
String input = sc.nextLine();
int count = sc.nextInt();
String total = repeat(input, count);
System.out.println(total);
}
public static String repeat(String str, int n) {
StringBuilder full = new StringBuilder();
if(n < 1) {return full.toString();}
repeat(str, n - 1);
for(int i = 0; i < n; i++){
full.append(str);
}
}
}
答案
问题的直接原因是,并非repeat()
方法中的所有条件流都具有返回值。但我不确定即使进行这种改变也会导致工作代码。考虑以下重构:
public void repeat(StringBuilder result, String str, int n) {
if (n == 0) return;
result.append(str);
repeat(result, str, n - 1);
return;
}
在这里,我们传入一个StringBuilder
对象,我们想要包含我们重复的字符串结果。我们还传递要重复的字符串和剩余转数。基本情况发生在没有更多转弯的地方,在这种情况下我们只是从递归方法返回。否则,我们添加一个字符串副本并进行递归调用。
您的原始递归尝试具有以下for循环:
for (int i=0; i < n; i++) {
full.append(str);
}
这看起来不是递归的,并且循环重复添加字符串会使递归点失败(尽管如果我不得不这样做,我可能会在现实生活中使用循环)。
另一答案
if(n < 1) {return full.toString();}
,但如果n> = 1,你不会返回任何东西。它应该是return repeat(str, n - 1);
但是你需要移动for...
部分
以上是关于Java - 打破入侵方法并返回值的主要内容,如果未能解决你的问题,请参考以下文章