IJVM阶乘代码异常:计算5!输出0而非120,求错误排查
IJVM阶乘方法错误排查与修正
问题分析
你当前的代码存在两个核心问题:
- 违反题目要求:题目明确规定不可添加额外方法调用,但你采用了递归实现,反复调用
fac方法,不符合要求。 - 递归逻辑错误:在递归分支中,你执行了
BIPUSH 0,这会破坏栈中参数和计算值的结构,最终导致计算结果错误,输出0。
同时你的代码完全没有遵循题目给出的参考逻辑(初始化result=1,当a>1时循环执行result *=a、a自减,最后返回result)。
修正后的代码(符合循环+局部变量要求)
按照题目要求的逻辑,用循环实现,仅使用局部变量,不调用任何额外方法:
; main-Methode BIPUSH 0 BIPUSH 5 // n INVOKEVIRTUAL fac ; print SPRINT "Result: fac(" BIPUSH 5 // n IPRINT SPRINT ") = " IPRINT SPRINT "\n" HALT fac 2 2 // 声明2个参数槽、2个局部变量槽:分别存输入n和结果result ISTORE 1 // 将传入的n存入局部变量1 BIPUSH 1 ISTORE 2 // 初始化result=1,存入局部变量2 loop_start: ILOAD 1 BIPUSH 1 IF_ICMPLE end_loop // 当n<=1时退出循环 // 执行result *= n ILOAD 2 ILOAD 1 IMUL ISTORE 2 // 执行n自减1 ILOAD 1 BIPUSH 1 ISUB ISTORE 1 GOTO loop_start end_loop: ILOAD 2 // 返回最终计算的result IRETURN
代码说明
fac 2 2:声明方法的参数槽和局部变量槽数量,确保能存放输入的n和结果result。- 初始化阶段:把传入的n存入局部变量1,将result初始化为1存入局部变量2。
- 循环逻辑:判断n是否大于1,若是则执行乘法更新result,再将n自减,重复循环;当n<=1时退出循环,返回最终的result。
运行这段代码后,输入5时会正确输出Result: fac(5)=120。
内容的提问来源于stack exchange,提问作者Jinsel
相关产品推荐
相关产品推荐

