用Go plan9汇编实现斐波那契数列计算

斐波那契数列是一个满足递推关系的数列,如:1 1 2 3 5 8 ...
其前两项为1,第3项开始,每一项都是其前两项之和。
用Go实现一个简单的斐波那契计算逻辑

func fib(n int) int {
	if n == 1 || n == 2 {
		return 1
	}
	return fib(n-1) + fib(n-2)
}

我们将其改进一下,用更简单的方式描述,同时把变量的定义提到前边,并将返回的逻辑拿到函数末尾。

func fib1(n int) int {
	var tmp, res, res1, res2 int
	if n == 1 {
		goto return1
	}
	if n == 2 {
		goto return1
	}
	tmp = n - 1
	res1 = fib1(tmp)
	tmp = n - 2
	res2 = fib1(tmp)
	res = res1 + res2
	return res
return1:
	return 1
}

继续改进

func fib2(n int) int {
	var tmp, res, res1, res2 int
	if n == 1 {
		goto return1
	}
	if n == 2 {
		goto return1
	}
	tmp = n
	tmp -= 1
	res1 = fib2(tmp)
	tmp = n
	tmp -= 2
	res2 = fib2(tmp)
	res = res1
	res += res2
	return res
return1:
	return 1
}

继续改进,复用变量

func fib3(n int) int {
	var res, res1 int
	if n == 1 {
		goto return1
	}
	if n == 2 {
		goto return1
	}
	res1 = n
	res1 -= 1
	res = fib3(res1)
	res1 = n
	res1 -= 2
	res1 = fib3(res1)
	res += res1
	return res
return1:
	return 1
}

继续改进

func fib4(r0 int) int {
	var r1, r2 int
	if r0 <= 2 {
		goto return1
	}
	r2 = r0
	r2 -= 1
	r1 = fib4(r2)
	r2 = r0
	r2 -= 2
	r2 = fib4(r2)
	r1 += r2
	return r1
return1:
	return 1
}

汇编函数接口定义

func fib5(n int) int

汇编函数实现

TEXT ·fib5(SB),$40-16
    MOVD R0, tmp-24(SP);MOVD R1, tmp-16(SP);MOVD R2, tmp-8(SP) // save context
    MOVD n+0(FP), R0; MOVD $0, R1; MOVD $0, R2 // R0: load value from stack memory
    CMP $2, R0; BLE LABEL_RETURN1 // if R0 <= 2 {goto LABEL_RETURN1}
    MOVD R0, R1; SUB $1,  R1 // R1 = R0 - 1
    MOVD R1, tmp-40(SP); CALL ·fib5(SB); MOVD tmp-32(SP), R1 // R1 = fib5(R1)
    MOVD R0, R2; SUB  $2, R2 // R2 = R0 - 2
    MOVD R2, tmp-40(SP); CALL ·fib5(SB); MOVD tmp-32(SP), R2 // R2 = fib5(R2)
    ADD R1, R2; MOVD R2, R0 // R0 = R1 + R2
    JMP LABEL_END
LABEL_RETURN1:
    MOVD $1, R0 // R0 = 1
LABEL_END:
    MOVD R0, n+8(FP) // set return value: R0
    MOVD tmp-24(SP), R0; MOVD tmp-16(SP), R1; MOVD tmp-8(SP),  R2 // recovery context
    RET
    

结果:
在这里插入图片描述

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

metabit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值