用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 intif n == 1 {goto return1}if n == 2 {goto return1}tmp = n - 1res1 = fib1(tmp)tmp = n - 2res2 = fib1(tmp)res = res1 + res2return res
return1:return 1
}

继续改进

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

继续改进,复用变量

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

继续改进

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

汇编函数接口定义

func fib5(n int) int

汇编函数实现

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL---视图索引

表定义&#xff1a; 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;S…

Redis设置开机自启动

1.新建一个系统服务文件 首先输入命令&#xff1a;vi /etc/systemd/system/redis.service 进入vim后粘贴下方代码&#xff0c;注意查看地址是否一致。 ExecStart后面接的是你的redis-server的安装位置和redis配置文件的目录 [Unit] Descriptionredis-server Afternetwork.ta…

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器&#xff0c;有时候需要启动SSH会话&#xff0c;启动的时候发现没反应&#xff0c;且事件日志显示&#xff1a;无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边&#xff0c;发现“无默…

2024最新最全:【CISP系列考试大纲】零基础入门到精通

CISP&#xff08;Certified Information Security Professional&#xff09;中文全称注册信息安全专业人员认证&#xff0c;是经中国信息安全测评中心依据中编办批准开展“信息安全人员培训与资质认证”的职能&#xff0c;推出的代表国家对信息安全专业人员能力认可的证书。 C…

数据结构——排序

前言&#xff1a;哈喽小伙伴们好久不见&#xff0c;也是顺利的考完试迎来了寒假。众所周知&#xff0c;不怕同学是学霸&#xff0c;就怕学霸放寒假&#xff0c;假期身为弯道超车的最佳时间&#xff0c;我们定然是不能懒散的度过。 今天我们就一起来学习数据结构初阶的终章——…

仰暮计划|“学校四周无围墙,教室通风望天窗”

一九七二年高中毕业&#xff0c;我成了回乡青年。玉米地里抡过锄&#xff0c;当阳峪村烧白干&#xff0c;化肥厂内装卸车&#xff0c;深山修渠扛石块。一九七四年十月&#xff0c;村革委会主任找我谈话&#xff0c;“回乡二年来&#xff0c;你无论是政治思想改造&#xff0c;还…

Python爬虫从入门到入狱系列合集

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

ES框架详解

ES框架详解 1、全文检索的介绍 ​ 那么对于一般的公司&#xff0c;初期是没有那么多数据的&#xff0c;所以很多公司更倾向于使用传统的数据库&#xff1a;mysql&#xff1b;比如我们要查找关键字”传智播客“&#xff0c;那么查询的方式大概就是:select * from table where …

公平与公正对团队的好处

公平与公正对团队的好处 如何联系我 作者&#xff1a;鲁伟林 邮箱&#xff1a;thinking_fioa163.com或vlinyes163.com 版权声明&#xff1a;文章和记录为个人所有&#xff0c;如果转载或个人学习&#xff0c;需注明出处&#xff0c;不得用于商业盈利行为。 一、什么是公平…

网络文件共享ftp

一&#xff0c;存储类型 &#xff08;一&#xff09;三种存储类型介绍 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 直连&#xff1a;硬盘加服务器 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#…

Android-三方框架的源码

ARouter Arouter的整体思路是moduelA通过中间人ARouter把路由信息的存到仓库WareHouse&#xff1b;moduleB发起路由时&#xff0c;再通过中间人ARouter从仓库WareHouse取出路由信息&#xff0c;这要就实现了没有依赖的两者之间的跳转与通信。其中涉及Activity的跳转、服务prov…

tomcat与servlet

目录 一、Http服务器 二、tomcat 1、概念 2、tomcat解压缩文件 &#xff08;1&#xff09;bin文件夹 &#xff08;2&#xff09;conf文件夹 &#xff08;3&#xff09;logs &#xff08;4&#xff09;webapps 3、借助tomcat服务器访问网页 三、servlet 1、概念 2、s…

在微信公众号上怎么做报名链接_让你的活动报名与众不同

微信公众号报名链接&#xff1a;引领潮流&#xff0c;让你的活动报名与众不同 在这个信息爆炸的时代&#xff0c;微信早已成为我们生活中不可或缺的一部分。而微信公众号&#xff0c;更是成为了企业和个人传递信息、推广品牌的重要平台。如何在众多的微信公众号中脱颖而出&…

流量控制与熔断利器:Sentinel介绍

这是《百图解码支付系统设计与实现》专栏系列文章中的第&#xff08;19&#xff09;篇&#xff0c;也是流量控制系列的第&#xff08;6&#xff09;篇。点击上方关注&#xff0c;深入了解支付系统的方方面面。 本篇聊聊流量控制与熔断利器Sentinel&#xff0c;背后的原理&…

CVE-2024-0195 利用分析

1. 漏洞介绍 SpiderFlow爬虫平台项目中spider-flow-web\src\main\java\org\spiderflow\controller\FunctionController.java文件的FunctionService.saveFunction函数调用了saveFunction函数&#xff0c;该调用了自定义函数validScript&#xff0c;该函数中用户能够控制 functi…

系统架构设计师

软考系统架构设计师笔记 专用的成电路&#xff08;Application Specific Integrated Circuit&#xff0c;ASIC) PTR记录&#xff1a;Pointer Record&#xff0c;常被用于反向地址解析&#xff0c;即通过IP地址查询服务器域名。 软件工程 软件开发模型 【增量模型的优点】 …

大模型 RAG 面试篇

1.LLMs 存在模型幻觉问题&#xff0c;请问如何处理&#xff1f; 检索LLM。 先用问题在领域数据库里检索到候选答案&#xff0c;再用LLM对答案进行加工。 2.基于LLM向量库的文档对话 思路是怎么样&#xff1f; 加载文件读取文本文本分割文本向量化问句向量化在文本向量中匹配…

配置中心原理和选型

为什么需要配置中心&#xff1f; 缺乏整体管理&#xff0c;是配置管理变得低效 处于运维管理的需求 很容易导致实例的配置出现不一致的地方 生产环境多个集群直接修改配置&#xff0c;导致不一致 配置和代码在一起&#xff0c;配置修改需要重新发布&#xff0c;非常低效 目的是…

【C语言】编译和链接深度剖析

文章目录 &#x1f4dd;前言&#x1f320; 翻译环境和运行环境&#x1f309;翻译环境 &#x1f320;预处理&#xff08;预编译&#xff09;&#x1f309;编译 &#x1f320;词法分析&#x1f320;语法分析 &#x1f309;语义分析&#x1f320;汇编 &#x1f309; 链接&#x1f…

【教程】集群搭建准备工作全流程

基于VMware创建虚拟机进行集群搭建&#xff0c;适用于hadoop/GreenPlum等集群 之前已经创建了三台虚拟机hadoop102&#xff0c;hadoop103&#xff0c;hadoop104来搭建hadoop集群&#xff0c;因为目前学习到了greemplum&#xff0c;因此新建三台虚拟机hadoop105&#xff0c;had…