You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IJVM阶乘代码异常:计算5!输出0而非120,求错误排查

IJVM阶乘方法错误排查与修正

问题分析

你当前的代码存在两个核心问题:

  1. 违反题目要求:题目明确规定不可添加额外方法调用,但你采用了递归实现,反复调用fac方法,不符合要求。
  2. 递归逻辑错误:在递归分支中,你执行了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:47:27