汇编实验 求第N个fibonacci数
汇编语言-计算Fibonacci数

call SendMsg
call OutputDec
mov ah,02h
mov dl,0ah
int 21h
mov dl,0dh
int 21h
mov ah,4ch
int 21h
main endp
Fib proc ;in ax,out rtnum
push ax
cmp ax,2
ja next1
mov rtnumL,1
mov rtnumH,0
jmp fib_end
next1:
dec ax
;rsnum1=fib(ax-1)
mov dx,rtnumH
mov rsnum2H,dx
;
pop dx
mov rsnum1H,dx
pop dx
mov rsnum1L,dx
;rtnum=rsnum1+rsnum2
mov dx,rsnum1L
add dx,rsBX,10
C0:
MOV DX,0
MOV AX,rtnumH
CMP AX,0
JE C1
DIV BX
MOV rtnumH,AX
MOV AX,rtnumL
DIV BX
MOV rtnumL,AX
call Fib
mov dx,rtnumL
push dx
mov dx,rtnumH
push dx
dec ax
;rsnum2=fib(ax-2)
call Fib
mov dx,rtnumL
mov rsnum2L,dx
c语言编写函数求斐波那契第n项的值

一、概述C语言作为一种高性能、高效率的编程语言,在计算机科学与工程领域中有着广泛的应用。
而斐波那契数列作为数学中的经典问题,在计算机编程中也有着重要的实际应用价值。
本文将借助C语言,编写一个用于求解斐波那契数列第n项值的函数,旨在展示C语言在实际问题解决中的应用。
二、斐波那契数列概述斐波那契数列是一个经典的数学问题,它包含着一系列按照特定规律排列的数字序列。
该数列中的每一项(从第三项开始)都是前两项的和,即F(n) = F(n-1) + F(n-2),其中F(1) = 1,F(2) = 1。
斐波那契数列的前几项如下:1, 1, 2, 3, 5, 8, 13, 21, …...三、C语言编写斐波那契数列求解函数在C语言中,我们可以定义一个函数,根据用户输入的n值,计算并返回斐波那契数列的第n项值。
下面是一个简单的C语言求解斐波那契数列的函数实现:```c#include <stdio.h>int fibonacci(int n){if (n <= 0){return -1; // 输入错误,返回-1}else if (n == 1 || n == 2){return 1; // 斐波那契数列的第一项和第二项均为1 }int a = 1, b = 1, c; // 初始化前两项的值for (int i = 3; i <= n; ++i){c = a + b;a = b;b = c;}return c;}int m本人n(){int n;printf("请输入斐波那契数列的项数n: ");scanf("d", n);int result = fibonacci(n);printf("斐波那契数列的第d项值为: d\n", n, result);return 0;}```通过上述代码,我们定义了一个名为fibonacci的函数,其中n为所求的斐波那契数列的项数。
递归方法求斐波那契函数FIB(N)

递归⽅法求斐波那契函数FIB(N)《微机原理实践》课程设计报告题⽬:递归⽅法求斐波那契函数FIB(N)专业:计算机系班级:学号:姓名:指导教师:胡美娇完成⽇期:2013年 1 ⽉1⽇⼀、课程设计⽬的1、加深对汇编语⾔理论和基本知识的理解,掌握DOS和BIOS系统功能调⽤,掌握运⽤汇编语⾔设计具有⼀定功能的软件的基本⽅法.2、通过编写⼀定规模和难度的程序,进⾏⼀次较全⾯的汇编编程训练,提⾼分析问题和解决问题的能⼒3、提⾼调试程序的能⼒⼆、课程设计内容递归⽅法求斐波那契函数FIB(N)要求:从键盘输⼊数N, 当N=0,1时,FIB=1 ;当N>=2时,FIB=FIB(N-1)+FIB(N-2),结果⽤⼗进制输出。
要求:具有友好的交互界⾯,建⽴主菜单界⾯:'********************Display Program********************input number n: Array the FIBN=三、课程设计过程1、算法设计(画出算法流程图)2、程序代码清单DATA SEGMENTNUM DW ?GRADE DW 2(?)MESS1 DB ,0AH,0DH,,0AH,0DH,'***Display Program***'MESS2 DB ,0AH,0DH, 'INPUT NUMBER N:$',0AH,0DH,MESS3 DB 0AH,0DH,'FIB(N)=$'MESS4 DB 'INPUT ERROR! $'MESS5 DB ,0AH,0DH, 'INPUT NUMBER N:'PROGNAM SEGMENTMAIN PROC FAR ;主程序⼊⼝ASSUME CS:PROGNAM,DS:DATA START:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXLEA DX,MESS1MOV AH,09INT 21HL1: LEA DX,MESS5MOV AH,09INT 21HMOV BX,0 ;显⽰欢迎主界⾯NEWCHAR:MOV AH,01H ;键盘输⼊,每个数据以回车结束INT 21HCMP AL,13JE LEE01SUB AL,30H ;转移JL ERRORCMP AL,9D ;AL中的数与取来的数据⽐较JG ERRORCBWXCHG AX,BX ;交换指令MOV CX,10DMUL CXXCHG AX,BXADD BX,AXJMP NEWCHAR ;⽆条件跳转ERROR:LEA DX,MESS4INT 21H ;中断JMP L1RETLEE01:MOV NUM,BXMOV SI,0MOV AX,0CALL FIB(N) ;段内直接过程调⽤LEA DX,MESS3MOV AH,09INT 21HPUSH BX ;将相关信息压⼊栈⾥PUSH CXPUSH SIPUSH DIMOV BX,GRADE[SI]MOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1DCALL DEC_DIVPOP DIPOP SIPOP CX ;将相关信息弹出栈内POP BXJMP L1RETMAIN ENDPDEC_DIV PROC NEARMOV DX,0DIV CXMOV BX,DXMOV DL,AL ;结果要放在dl中ADD DL,30HMOV AH,02HINT 21HRETDEC_DIV ENDPFIB(N) PROC NEARCMP NUM,0 ;num为0转到L2JE LEE02CMP NUM,1 ;num⾃减1JE LEE02DEC NUMCALL FIB(N)MOV AX,GRADE[SI]MOV BX,GRADE[SI-2]MOV GRADE[SI-2],AXADD AX,BX ;进⾏加法运算MOV GRADE[SI],AXJMP LEE03LEE02:MOV GRADE[SI],1ADD SI,2MOV GRADE[SI],1LEE03: RETFIB(N) ENDPPROGNAM ENDSEND START3、调试过程(包括实验过程中实验步骤,出现的问题,解决的⽅法,使⽤的实验数据等)步骤:⾸先是先对递归函数的了解,然后分成三种情况,⼀种是输⼊的是0和1的情况,⼀种是输⼊的是其他数字,最后⼀种是输⼊的不是数字,最后对各种情况进⾏设计。
利用递归思想求解第n项斐波那契数列的值

利用递归思想求解第n项斐波那契数列的值自从我认识了黄金比,得知黄金比在生活中很常见,于是我又进行了课外拓展,了解了斐波那契数列。
斐波那契数列,顾名思义是由斐波那契发现的。
指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……此数列的特点是:这个数列从第3项开始,每一项都等于前两项之和。
用关系式来表达就是:n(数列的第n个数,n≥3)=n-1+n-2。
此外,还有一个特点,那就是从第二项开始。
每个奇数项的平方比前后两个项的积少1;每个偶数项的平方比前后两个项相乘的积多1。
斐波那契数列最大的特点就是从第三个项开始,前面两个项的和与后面一个项的比值无限接近于黄金比(0.)。
这个数列在生活中很常用,比如葵花、鹦鹉螺等等都存有斐波那契数列的影子。
最奇妙的.就是,这个数列与我国古代数学家杨辉辨认出的杨辉三角存有很大的相连关系。
在现代物理、科东俄晶体结构、化学等领域,斐波那契数列都起著很关键的促进作用。
诸如大家平时耳熟能详的断臂维纳斯,人民大会堂。
古埃及的一些建筑,到处都有斐波那契数列的身影。
数列不仅增加建筑体的美观形象,还增加了建筑体的质量。
斐波那契数列还有一个别称,那就是兔子数列。
兔子的繁殖与斐波那契数列十分相似。
在一些专门饲养兔子的农厂掌握斐波那契数列,可以更好的掌握兔子数量的增减,从而达到节省饲料的目的。
斐波那契数列在我们平时的生活中除了什么用处呢?答案就是确实有的,于是我就想起了在演出才艺中是不是也可以使用?比如演出魔术:在一张纸上中间画11个大方格。
使人背对着自己(保证自己看不出他在纸上写下什么),在前两个方格中随便填上两个1至10之间的数。
从第三个方格已经开始,在每个方格里插入前两个方格里的数之和。
使对方一直求出第10个方格里的数。
现在,叫做对方算出第10个方格里的数,自己只须要在计算器上按几个键,便能够讲出第11个方格里的数必须就是多少。
对方可以非常惊讶地辨认出,把第11个方格里的数计算出来,税金的结果与你的预测一模一样!这就怪异了,在不能晓得头两个数就是多少的情况下,只晓得第10个数的大小,不晓得第9个数的大小,怎么能够猜猜对第11个数的值呢?其实只须要将第十个数除以0.......就可以获得恰当的结果,假如第十个数就是,则可以将÷0.......≈,最后就可以辨认出,结果就是一模一样。
编写计算并输出斐波那契数列前20个值的程序汇编

斐波那契数列是一个非常经典的数学问题,也是编程领域经常使用的一个案例。
希望通过本文的探讨和分析,不仅能够深入了解斐波那契数列的概念,更能掌握如何使用汇编语言编写程序来计算和输出斐波那契数列的前20个值。
1. 斐波那契数列的概念在开始讨论如何编写程序来计算并输出斐波那契数列前20个值之前,我们首先需要对斐波那契数列的概念进行全面的理解和回顾。
斐波那契数列是指这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列可以用递归的方式定义:F(0) = 0,F(1) = 1, F(n) = F(n-1) + F(n-2)(n ≥ 2)。
这样,我们可以根据这个递归的定义来计算出斐波那契数列的前20个值。
2. 编写汇编程序计算并输出斐波那契数列前20个值在深入讨论如何编写汇编程序来计算并输出斐波那契数列前20个值之前,我们需要回顾一下汇编语言的基本语法和程序结构。
汇编语言是一种底层的计算机语言,它使用符号化的指令来操作计算机的硬件。
在编写汇编程序时,我们需要考虑如何使用寄存器和内存来存储数据,以及如何使用指令来进行计算和控制流程。
基于这些基本的概念,我们可以开始编写汇编程序来计算并输出斐波那契数列前20个值。
3. 个人观点和理解在理解斐波那契数列的概念和原理之后,我们可以深入思考如何用汇编语言来实现相关的计算和输出。
从个人的观点和理解来看,汇编语言作为一种底层的计算机语言,可以更加直接地操作计算机的硬件,从而实现高效的算法和程序。
通过编写汇编程序来计算并输出斐波那契数列前20个值,我们不仅可以更加深入地理解斐波那契数列的计算过程,更能够对汇编语言的特性和优势有更加深入的认识。
4. 总结和回顾通过本文的探讨和分析,我们深入了解了斐波那契数列的概念和原理,更掌握了如何使用汇编语言来编写程序来计算并输出斐波那契数列前20个值。
在这个过程中,我们通过简单的递归定义和汇编语言的基本语法和程序结构,实现了一个高效的算法和程序。
python 递归法求fibonacci数列

一、引言在计算机科学领域,Fibonacci数列是一个非常常见的数学问题,通过递归法求解Fibonacci数列是其中的经典问题之一。
Python作为一种广泛应用的编程语言,拥有强大的递归支持,因此使用Python编写递归算法求解Fibonacci数列是一个非常有意义的练习和挑战。
二、Fibonacci数列简介1. 什么是Fibonacci数列?Fibonacci数列是一个古老而经典的数学问题,起源于数学家Leonardo Fibonacci之名。
该数列从0和1开始,后续的每一项都是前两项的和。
该数列可以表示为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...2. Fibonacci数列的递归定义Fibonacci数列可以通过递归方式定义如下:F(n) = F(n-1) + F(n-2)三、Python递归法求解Fibonacci数列1. 递归函数的编写在Python中,我们可以利用递归的思想来求解Fibonacci数列。
下面是一个简单的Python递归函数,用于计算Fibonacci数列的第n 项:```pythondef fibonacci(n):if n <= 0:return "输入错误!"elif n == 1:return 0elif n == 2:return 1else:return fibonacci(n-1) + fibonacci(n-2)```2. 递归函数的解析与分析以上所示的fibonacci函数中,首先对n进行了边界条件的判断,当n 小于等于0时返回错误信息,当n等于1时返回0,当n等于2时返回1。
对于大于2的情况,利用递归的思想,将Fibonacci数列分解为了两个子问题,并通过递归调用自身来求解,然后将两个子问题的结果相加,即为所求的Fibonacci数列的第n项的值。
3. 递归法的优缺点分析递归法求解Fibonacci数列确实是一种非常优雅和简洁的方法,但它也存在一些缺点。
求Fibonacci数程序设计

求Fibonacci数程序设计求Fibonacci数程序设计1. 简介Fibonacci数列是数学中一个非常经典的数列,定义如下:前两项是0和1,之后的每一项都是前两项的和。
即F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2)。
本文档将介绍如何设计一个程序来求解Fibonacci数列的第n项。
2. 算法设计我们可以使用递归算法或迭代算法来求解Fibonacci数列的第n项。
下面分别介绍这两种算法的思路和实现。
2.1 递归算法递归算法是一种自己调用自己的算法。
对于求解Fibonacci数列的第n项,可以使用递归算法如下:pythondef fibonacci_recursive(n):if n <= 1:return nelse:return fibonacci_recursive(n-1) +fibonacci_recursive(n-2)上述代码中,递归函数`fibonacci_recursive`接受一个整数参数n,返回Fibonacci数列的第n项。
如果n小于等于1,直接返回n;否则,返回前两项之和。
递归调用`fibonacci_recursive`函数,直到n<=1停止递归。
该方法的时间复杂度是指数级别的,因为存在大量的重复计算。
当n较大时,递归算法的效率较低。
2.2 迭代算法迭代算法是一种通过循环来求解问题的算法。
对于求解Fibonacci数列的第n项,可以使用迭代算法如下:pythondef fibonacci_iterative(n):if n <= 1:return nfib_n = 0fib_n_minus_1 = 1fib_n_minus_2 = 0for i in range(2, n+1):fib_n = fib_n_minus_1 + fib_n_minus_2fib_n_minus_2 = fib_n_minus_1fib_n_minus_1 = fib_nreturn fib_n上述代码中,迭代函数`fibonacci_iterative`同样接受一个整数参数n,返回Fibonacci数列的第n项。
python计算斐波那契数列的第n项 循环

在介绍如何使用Python计算斐波那契数列的第n项之前,我们先来了解一下斐波那契数列的定义和特点。
1. 斐波那契数列的定义斐波那契数列是指这样一个数列:0、1、1、2、3、5、8、13、21、34…… 从第3项开始,每一项都等于前两项之和。
斐波那契数列可以用递归的方式推导:F(0) = 0,F(1) = 1,F(n) = F(n-1) + F(n-2)(n ≥ 2)。
2. 斐波那契数列的特点斐波那契数列是一个非常经典的数学问题,在数学、计算机科学等领域都有重要的应用价值。
它具有以下几个特点:- 数列呈现出明显的递推关系,每一项都依赖于前两项的值。
- 数列增长迅速,项与项之间的比值逐渐趋近于黄金分割比例。
- 斐波那契数列在自然界、金融领域等方面有着广泛的应用,被称为“上帝的密码”。
有了对斐波那契数列的基本认识,接下来我们就来探讨如何使用Python计算斐波那契数列的第n项。
在Python中,有多种方法可以计算斐波那契数列的第n项,这里我们重点介绍一种基于循环的方法。
通过循环计算斐波那契数列,可以有效避免递归的性能问题,提高计算效率。
以下是使用循环计算斐波那契数列的第n项的Python代码示例:```pythondef fibonacci(n):a, b = 0, 1for _ in range(n):a, b = b, a + breturn a```在上面的代码中,我们使用了两个变量a和b来分别表示斐波那契数列中的两个相邻项。
通过循环迭代的方式,不断更新a和b的值,最终得到第n项的斐波那契数列的值。
通过以上代码,我们就可以方便地计算斐波那契数列的第n项。
我们可以使用fibonacci(10)来计算斐波那契数列的第10项的值。
这种基于循环的方法不仅简单高效,而且可以处理大规模的计算需求。
总结回顾:通过本文的介绍,我们深入了解了斐波那契数列的基本定义和特点,以及使用Python通过循环计算斐波那契数列的第n项的方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编实验求第N个fibonacci数
datas segment
;此处输入数据段代码
result db 1d,24 dup(0)
x db 1d,24 dup(0)
mess1 db 0dh,0ah,'Please choose a data from 1 to 100:','$' mess2 db 0dh,0ah,'The result is:','$'
mess3 db 0dh,0ah,'Press Q/q to exit.','$'
flag dw ?
messerror db 0dh,0ah,'Input error,please re-enter.','$'
quit db 0dh,0ah,'You have typed Q/q to exit.','$'
datas ends
stacks segment
;此处输入堆栈段代码
dw 128 dup(?)
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks,es:datas
start:
mov ax,datas ;ds寄存器设置到当前的数据段
mov ds,ax
mov es,ax
mov ax,stacks ;ss寄存器设置到当前堆栈段
mov ss,ax
;此处输入代码段代码
reinput:
push ax ;进栈
push bx
push cx
push dx
push si
push di
mov ah,09 ;显示操作符
lea dx,mess3
int 21h
lea dx,mess1
int 21h
;输入规模n,并且转换为十进制数
mov bx,0
input:
mov ah,01
int 21h
cmp al,'q' ;判断输入是否为q jz end_ ;跳转到end_
cmp al,'Q'
jz end_
cmp al,0dh
jz cont
cmp al,'0' ;输入是否为数字 jb error ;跳转到error
cmp al,':'
jnb error
sub al,30h
cbw
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp input
error: ;提示出错信息
mov ah,09
lea dx,messerror
int 21h
jmp reinput ;跳转回开始状态
end_: ;提示已退出程序信息
mov ah,09
lea dx,quit
int 21h
mov ah,4ch
int 21h
ret
cont: mov cx,bx ;输入的数放到cx中
cmp cx,2
jle print ;如果小于等于2,就直接输出结果
sub cx,2 ;否则以cx-2作为外循环,把两个数相加 next: mov di,cx
mov cx,25
mov si,0
adde: mov dl,x[si]
mov dh,result[si]
add dl,dh ;将两个存储单元的数中进行相加
mov result[si],dl
mov x[si],dh ;将上次的相加结果放入X中
cmp dl,10d
jae great ;如果大于10D,则转移
inc si
jmp goon
great: sub result[si],10d ;将尾数存入本单元
inc si
add x[si],1 ;高位加1
goon: loop adde
mov cx,di
loop next
print: lea dx,mess2 ;输出显示提示
mov ah,09
int 21h
mov cx,25
mov si,24
display1: cmp flag,0 ;标志位判断输出的高位是否为0 jnz n2
cmp result[si],0
jz n3
add flag,1
n2: mov dl,result[si] ;以十进制输出
add dl,30h
mov ah,02h
int 21h
n3: dec si
loop display1
mov flag,0
mov result[0],1d
mov x[0],1d
mov si,1
mov cx,24
initial: mov result[si],0
mov x[si],0
add si,1
loop initial
mov si,0
pop di ;出栈
pop si
pop dx
pop cx
pop bx
pop ax
jmp reinput ;跳转回开始状态,进行下一次计算
mov ah,4ch
int 21h
codes ends
end start。