16位masm汇编实现记忆化递归搜索斐波那契数列第50项
.model small
;递归fib,使用压缩BCD码,小端派
.data
y1 byte 6 dup(0)
y2 byte 6 dup(0)
vis byte 1,1,1,61 dup(0) ;便于调试
num byte 6 dup(0),1,5 dup(0),1, 5 dup(0), 300 dup(0) ;di
.stack 4096
.code
main proc far
start:
mov ax,@data
mov ds,ax
mov ax,50
call fib
mov bx,offset y1
add bx,5
mov cx,6
output:
mov dl,[bx]
mov dh,dl
push cx
mov cl,4
shr dl,cl;取出高四位
pop cx
or dl,30h
mov ah,2h
int 21h
mov dl,dh
and dl,0Fh;取出低四位
or dl,30h
mov ah,2h
int 21h
dec bx
loop output
mov ax,4c00h
int 21h
main endp
fib proc near ;从ax传参,保证ah为0,然后将计算得到的fib(al)写入表中,再写入y1,返回
push ax ;先备份一下
mov bx,offset vis
xlat
and al,al
jnz returnresult ;查表有结果,直接返回结果
pop ax ;vis数组置位
push ax
mov si,ax
mov [bx+si],1
pop ax
push ax
sub ax,2
call fib ;求fib(n-2)
mov bx,offset y1 ;将fib(n-2)从y1转存到栈
pop ax
push ax
push [bx]
push [bx+2]
push [bx+4]
dec ax
call fib
mov bx,offset y1 ;把y1 fib(n-1)的值加到y2上
mov bp,offset y2
pop ds:[bp+4]
pop ds:[bp+2]
pop ds:[bp]
pop ax
push ax
mov cx,6
and ax,ax;清空进位标识cf
bcdadd:
mov al,[bx]
adc al,ds:[bp]
daa
mov ds:[bp],al
inc bx
inc bp
loop bcdadd
;最高位应该没有进位了
pop ax ;恢复参数
mov bl,6
mul bl
mov bx,offset num ;bx指向表
add bx,ax
mov bp,offset y2 ;bp指向算出来的y2
mov di,offset y1
mov si,0
mov cx,3
writenum:
mov ax,ds:[bp+si] ;bp默认ss
mov [bx+si],ax ;y2->num
push bx
mov bx,di
mov [bx+si],ax ;y2->y1
pop bx
add si,2
loop writenum
ret
returnresult: ;将表中的答案弄到y1
pop ax
mov bl,6
mul bl
mov bx,offset num
mov bp,offset y1
add bx,ax
mov ax,[bx+4]
mov ds:[bp+4],ax
mov ax,[bx+2]
mov ds:[bp+2],ax
mov ax,[bx]
mov ds:[bp],ax
ret
fib endp
end start
16位masm汇编实现记忆化递归搜索斐波那契数列第50项的更多相关文章
- php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习)
php实现记忆化递归--以斐波那契数列为例(还是以边学边做为主,注重练习) 一.总结 1.递归不优化的话,30层开外就有点吃力了 2.php因为定义变量的时候不用定义变量类型,所以数组里面的类型也是p ...
- 【递归】斐波那契数列第n个数
递归.递推计算斐波那契数列第n项的值: #include <stdio.h> long long fact(int n); //[递推]计算波那契数列第n个数 long long fact ...
- Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器
一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件处理: if 条件成立: val = 1 else: val = 2 改成三元运算 val = 1 if 条件成立 else ...
- Python递归及斐波那契数列
递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...
- python递归与非递归实现斐波那契数列
1.题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). 递归实现: class Solution(): def Fibnacci(self ...
- C++用递归实现斐波那契数列
[题目描述] 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和. 给出一个正整数a,要求菲波那契数列中第a个数是多少. [输入] 第1行是测试数据的组数n, ...
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- [每日一题2020.06.14]leetcode #70 爬楼梯 斐波那契数列 记忆化搜索 递推通项公式
题目链接 题意 : 求斐波那契数列第n项 很简单一道题, 写它是因为想水一篇博客 勾起了我的回忆 首先, 求斐波那契数列, 一定 不 要 用 递归 ! 依稀记得当年校赛, 我在第一题交了20发超时, ...
- X86汇编——计算斐波那契数列程序(详细注释和流程图说明)
X86汇编实现斐波那契数列 程序说明: 输入斐波那契数列的项数, 然后依次输出斐波那契数列, 输入的项数小于256且为数字, 计算的项数不能超过2^16次方, 输入失败是 不会回显数字 因为存结果是A ...
随机推荐
- 接口自动化框架 - httprunner 引用unittest
httprunner其中一个比较好的点就是利用type动态创建类,使用setattr动态增加方法和属性. 将维护的用例进行转变为继承unittest.Textcase的类,很好的与unittest结合 ...
- JS中正则表达式应用
判断字符串是否含有中文字符: var pattern = /.*[\u4e00-\u9fa5]+.*$/; var str = "asd按时"; console.log(patte ...
- java使用顺序数组实现二叉树
顺序数组实现二叉树 实现原理 对于下标为index的节点其满足 1.左孩子节点的下标为2index+1 2.右孩子节点的下标为2index+2 代码实现 package tree; public cl ...
- 2019中山纪念中学夏令营-Day4[JZOJ]
Begin (题目的排序方式:难易程度) 什么是对拍: 对拍是一种在写完程序后,验证自己程序是不是正解的比较方便的方法. 实现过程: 对同一道题,再打一个暴力程序,然后用一些大数据等跑暴力程序来进行验 ...
- Mysql8 root密码忘记了
需要确定自己的mysql版本是否是8 [root@smonitor ~]# mysql --version mysql Ver 8.0.13 for Linux on x86_64 (MySQL Co ...
- 使用zookeeper报错 stat is not executed because it is not in the whitelist. envi is not executed because it is not in the whitelist.
在使用四字命令或者zk ui界面查看zookeeper集群时,出现如下提示: stat is not executed because it is not in the whitelist. envi ...
- LeetCode——全排列
给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3 ...
- Delphi 数组与记录类型
- MySQL更新字段来自另一个表的count()值
假设有文章post和评论comment两个表,文章表记录有评论的数量,但是这个值我们要一次更新. 如下,现在post表的comment_count都是0,我们的目标是:执行一个SQL语句,让其把统计c ...
- 高性能mysql 第5章 创建高可用的索引
b-tree索引 一定程度上说,mysql只有b-tree索引.他没有bitmap索引.还有一个叫hash索引的,只在Memory存储引擎中才有. b-tree索引跟oracle中的大同小异. mys ...