Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中递归方法的停止和返回值_Java_Android_String_Methods_Recursion - Fatal编程技术网

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