java - 将递归转换为 (for,while) 循环
问题描述
我需要帮助将此递归方法转换为任何循环,因为它会给出此异常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);
}
}
解决方案
您不需要任何循环来计算结果。当您为您编写第一个值时,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
a
如您所见,该值在b
和之间迭代a^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;
}
推荐阅读
- php - 无法从 PHP 上的 MySQL 响应中检索信息
- android - 从firebase android studio获取时列表视图中的数据重复
- selenium - 驱动程序实例必须符合 W3C 规范,以支持在使用 ImplicitWait 时获取超时值错误
- php - 使 Powershell CLI(环境)变量在 PHP 中可用
- javascript - 禁用按钮以避免多个表单提交
- python - 声明时类内的 Python 字段间引用
- string - 我可以用我的方法扩展内置的 String 类吗
- python - 使用 pyspark 进行均值偏移聚类
- error-handling - Replace null value in Table before TransformColumns
- node.js - sails.js 会话数据未保存到数据库中