java中递归方法的停止和返回值
我正在尝试一个递归方法,通过一些规则返回一些随机字符。该方法工作得很好,但问题是它既不返回我需要的值,也不在我编写java中递归方法的停止和返回值,java,android,string,methods,recursion,Java,Android,String,Methods,Recursion,我正在尝试一个递归方法,通过一些规则返回一些随机字符。该方法工作得很好,但问题是它既不返回我需要的值,也不在我编写return myString时停止 以下是方法(请查看评论): 公共字符串行生成器(字符串sir){ 上限=”; Log.v(标记“RowGenerator已启动”); int randI=1+(int)(Math.random()*4); int randJ=1+(int)(Math.random()*2); int randK=1+(int)(Math.random()*2);
return myString
时停止
以下是方法(请查看评论):
公共字符串行生成器(字符串sir){
上限=”;
Log.v(标记“RowGenerator已启动”);
int randI=1+(int)(Math.random()*4);
int randJ=1+(int)(Math.random()*2);
int randK=1+(int)(Math.random()*2);
Log.v(标签,“内部行生成器:randI”+randI+”,randJ“+randJ+”,randK“+randK);
字符串上限=sir.replaceAll(“[^A-Z]+”,”);
sir=sir.replaceAll(“[^a-z]+”,”);
Log.v(标签,“上串”+上串);
//检查是否存在a..z&sir>=5
如果((sir.length()>=5)和&upper.isEmpty()){
Log.v(标记,“sir更改RowGenerator(sir);
语句到返回RowGenerator(sir);
更改RowGenerator(sir);
语句到返回RowGenerator(sir);
调用RowGenerator(sir);
它不会返回。这意味着结果被遗忘,方法处理将继续
由于最终代码块(包含日志
和return sir;
)不受if的保护,因此每次执行时都会打印许多日志。这也解释了最终结果不正确的原因(在这些情况下,方法返回在参数中接收到的值,而不是递归)
我想您应该将行生成器(sir);
替换为返回行生成器(sir);
来解决您的问题。当您调用行生成器(sir);
时,它不会返回。这意味着结果被遗忘,方法处理将继续
由于最终代码块(包含日志
和return sir;
)不受if的保护,因此每次执行时都会打印许多日志。这也解释了最终结果不正确的原因(在这些情况下,方法返回在参数中接收到的值,而不是递归)
我想你应该用return RowGenerator(sir);
替换return RowGenerator(sir);
来解决你的问题。实际上在递归方法中,return()
操作会将值返回到上一个函数调用。
例如,如果该方法已经调用了4次,并且在第4次return调用
,则第三级中的方法将从执行第四个函数调用的行开始,依此类推,直到第一个函数执行返回()
我不知道你的整个程序,但如果这是你所有的代码,一个简单的系统。退出(1)
就足够了。实际上,在递归方法中,return()
操作会将值返回到上一个函数调用。
例如,如果该方法已经调用自己4次,并且在第4次return()调用
,则第三级中的方法将从执行第四个函数调用的行开始,依此类推,直到第一个函数执行返回()
我不知道你的整个程序,但如果这是你所有的代码,一个简单的系统。退出(1)
就足够了。我的直觉是,你的方法过于复杂了。如果你把它分解,调试起来会更容易。我想如果((sir.length()>=5)和&upper.isEmpty()){
条件永远不会满足它是满足的,我只是没有发布输入S、i、J和K。在日志中我知道它是有效的。我的直觉是你已经将你的方法复杂化了。如果你把它分解,它将更容易调试。我猜如果((sir.length()>=5)和&upper.isEmpty()){
条件从未满足它是满足的,我只是没有发布输入S、i、J和K。在日志中,我得到它是有效的。我需要再次调用该方法,为什么我要返回值?是的。当然,您正在调用该方法行生成器(先生)
,您只需要返回方法的返回值…我需要再次调用该方法,为什么我要返回值?是的..当然您正在调用方法行生成器(sir)
,您只需要返回方法的返回值。。。
public String RowGenerator(String sir) {
upper = "";
Log.v(TAG, "RowGenerator Started");
int randI = 1 + (int)(Math.random() * 4);
int randJ = 1 + (int)(Math.random() * 2);
int randK = 1 + (int)(Math.random() * 2);
Log.v(TAG, "inside RowGenerator: randI " + randI + ", randJ " + randJ + ", randK "+ randK);
String upper = sir.replaceAll("[^A-Z]+", "");
sir = sir.replaceAll("[^a-z]+", "");
Log.v(TAG, "String upper " + upper);
//checking if there is a..z & sir>=5
if ((sir.length()>=5) && upper.isEmpty()) {
Log.v(TAG, "sir <5 & !b " + String.valueOf(sir)); // here it prints out exactly what i need, but when i setText id has another value.
sir1.setText(String.valueOf(sir)); // this textview does not get the right value.
return sir; // i want to end the function here and return the value , as i call it as follows: someString = String.valueOf(RowGenerator(sir))
} else if (sir.isEmpty()) {
sir = S[1];
Log.v(TAG, "First sir value: " + sir);
RowGenerator(sir);
} else if (sir.length()<5 && upper.isEmpty()) {
sir = "";
RowGenerator(sir);
}
// if there is A..Z
else if (!upper.equals(null)) {
if(upper.equals(S[0])) {
sir = sir + S[1];
} else if (upper.equals(I[0])) {
sir = sir + I[randI];
} else if (upper.equals(J[0])) {
sir = sir + J[randJ];
} else if (upper.equals(K[0])) {
sir = sir + K[randK];
}
Log.v(TAG, "new value added to sir: " + sir);
RowGenerator(sir);
}
Log.v(TAG, "returning value "); // everything goes great till here, but then this log appears like 5-20 times randomly at each start, it should end in first if, but it got till here
sir1.setText(String.valueOf(sir));
return sir;
}