热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

我需要帮助将此递归方法转换为任何循环,因为它给出了此异常 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;
}






推荐阅读
author-avatar
mobiledu2502917243
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有