递归中的前缀无法正常工作

时间:2017-03-30 20:11:57

标签: java recursion

这是我的代码:

class Backwards {
    String str;
    Backwards(String s) {
        str = s;
    }

    void backward(int idx) {
        if(idx != str.length()-1) {
            System.out.println(idx);
            backward(++idx);
        }
        System.out.print(str.charAt(idx));
    }
}

class StrBackDemo {
    public static void main(String args[]) {
        Backwards s = new Backwards("This is a test");
        s.backward(0);
    }
}

当我用表达式idx +1调用函数本身时效果很好,但是对于++idx,它会打印第一个字符两次,并且根本不会打印最后一个字符。

With <+idx> output: ttset a si sih
With <idx +1> output: tset a si sihT

2 个答案:

答案 0 :(得分:2)

++我将增加i的值,然后返回递增的值。

botchat.js:34449 Refused to connect to 'https://directline.botframework.com/v3/directline/conversations' because it violates the following Content Security Policy directive: "default-src 'self' 'unsafe-eval' 'unsafe-inline' *.accenture.com". Note that 'connect-src' was not explicitly set, so 'default-src' is used as a fallback.

i ++将递增i的值,但返回在递增之前我保持的原始值。

 i = 1;
 j = ++i;
 (i is 2, j is 2)

所以在idx = 0的代码协处理器中;

 i = 1;
 j = i++;
 (i is 2, j is 1)

因此你得错了结果

但是在idx + 1的情况下;

System.out.println(idx); //idx = 0;
            backward(++idx); //its changed idx = 1 and passed 1 to this function
 System.out.print(str.charAt(idx));//After all recursion call here idx =1 not idx =0; 

答案 1 :(得分:0)

它会在递归调用backward(++idx)上导致您传递递增值并且还会增加值本身。 运营商++idx的值设置为idx + 1
在最后一次调用中,当方法获得索引13并为其打印char并且前一个调用也具有索引13时,您将完成情境。同时,方法的第一次调用具有索引1.

要修复您的代码使用:

    void backward(int idx) {
        if(idx != str.length()-1) {
            System.out.println(idx);
            backward(idx + 1);
        }
        System.out.print(str.charAt(idx));
    }

使用idx + 1 idx值将保持相同的位置。