如何为递归函数编写三地址码?以阶乘递归实现为例
递归阶乘函数的三地址码编写方法
先看你给出的递归阶乘C++代码:
int fact(int n) { if(n == 1) return 1; return n * fact(n-1); }
生成的三地址码(带标签说明)
// 函数入口,将参数n存入临时变量t0 t0 = n // 条件判断:若n等于1则跳转到基准情况分支 if t0 == 1 goto L1 // 递归分支:计算n-1,结果存入t1 t1 = t0 - 1 // 调用递归函数fact(t1),返回值存入t2 t2 = call fact(t1) // 计算n与递归结果的乘积,存入t3 t3 = t0 * t2 // 返回最终计算结果 return t3 // 基准情况分支:直接返回1 L1: return 1
关键逻辑说明
- 参数统一引用:把输入参数
n存入临时变量t0,是三地址码中标准化的处理方式,避免直接操作参数带来的歧义。 - 条件跳转实现:用
if t0 == 1 goto L1对应原代码的if(n==1)逻辑,通过标签L1区分基准情况和递归分支。 - 递归调用处理:
call fact(t1)是递归三地址码的核心——必须用临时变量t2承接递归调用的返回值,才能让其参与后续的乘法运算。 - 分支返回:两个分支分别通过
return指令返回对应结果,完成函数的逻辑闭环。
内容的提问来源于stack exchange,提问作者Arpit Shukla
相关产品推荐
相关产品推荐

