将递归转换为 (for,while) 循环

时间:2021-07-03 20:20:39

标签: java

我需要帮助将此递归方法转换为任何循环,因为它给出了此异常 java.lang.StackOverflowError

public static long Q(long a,long b,long q){
    if(q==1){
        return a;
    }
    if(q==2){
        return b;
    }
    else{
        return Q(a,b,q-1)^Q(a,b,q-2);
    }
}

1 个答案:

答案 0 :(得分:4)

您不需要任何循环来计算结果。当您为 Q(...) 编写第一个值时,您会看到一个模式,其中相同的术语被取消,因为您将在某个时刻运行类似 Q(x) ^ Q(x) 的东西,结果是 0。检查以下 Q(...) 列表以获取第一个数字:

Q(1) = a
Q(2) = b
Q(3) = Q(2) ^ Q(1)          = a^b
Q(4) = Q(3) ^ Q(2)
     = Q(2) ^ Q(1) ^ Q(2)
     = Q(1)                 = a
Q(5) = Q(4) ^ Q(3)
     = Q(1) ^ Q(2) ^ Q(1)
     = Q(2)                 = b
Q(6) = Q(5) ^ Q(4)
     = Q(2) ^ Q(1)          = a^b
Q(7) = Q(6) ^ Q(5)
     = Q(2) ^ Q(1) ^ Q(2)
     = Q(1)                 = a
Q(8) = Q(7) ^ Q(6)
     = Q(1) ^ Q(2) ^ Q(1)
     = Q(2)                 = b
Q(9) = Q(8) ^ Q(7)
     = Q(2) ^ Q(1)          = a^b

如您所见,该值在 aba^b 之间迭代。因此,您可以对 q 使用简单的模检查来获得正确的值:

public static long Q(long a,long b,long q){
    long modulo = q%3;
    if (modulo == 0) {
        return a^b;
    }
    if (modulo == 1) {
        return a;
    }
    return b;
}