給定一個正整數(shù)n計算出對應斐波那契數(shù)列對應的值棗空
為桐城等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及桐城網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、成都做網(wǎng)站、桐城網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
說明:
用mackbookpro i7 2.7GHZ筆記本進行測試,結(jié)果如下:
備注: 當n=80時,由于測試等待時間過長,強制中斷了執(zhí)行。念祥
從測試結(jié)果看出,當n逐漸增大,遞歸方式計算斐波拉契數(shù)列的時間復雜性急劇增加。當n值較大時可以考慮用循環(huán)方式代替。
類凳高瞎似的方式也可以用于,求階乘、遍歷目錄、漢諾塔等問題的解決。在后期的文章中,我將這些內(nèi)容進行補充,敬請期待,謝謝。
僅供參考吧
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
BUFF DB 10
DB ?
DB 10 DUP(?)
RESULT DW ?
RESULT_SHOW DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
LEA DX,BUFF
MOV AH,0AH
INT 21H
MOV DI,0
L0: ;統(tǒng)計一共有多少個困兆虧數(shù)字組成
CMP BYTE PTR DS:[DI+2],0DH
JZ GO
INC DI
JMP L0
GO: ;計算第n個斐波那契數(shù),把數(shù)字字符串轉(zhuǎn)換為十進制數(shù)
MOV BL,10
MOV AX,1
MOV SI,DI ;為后面判斷輸入的是不是只輸入一個數(shù)有用
MOV CX,DI
L2: PUSH AX
SUB BYTE PTR DS:[DI+1],30H
MUL BYTE PTR DS:[DI+1]
ADD RESULT,AX
POP AX
MUL BL
DEC DI
LOOP L2
;分兩種情況:1.輸入猜昌的是1;2.輸入的不是1
CMP SI,1
JNZ L7
CMP BYTE PTR RESULT,1
JNZ L7
MOV AX,RESULT
JZ L4
L7: MOV AX,1
MOV BX,0
MOV CX,RESULT
DEC CX
L3: ;第n個斐波那契數(shù)存放到AX中
PUSH AX
ADD AX,BX
POP BX
LOOP L3
L4:
;顯示這個斐波那契數(shù)
MOV DX,0
LEA SI,RESULT_SHOW
MOV DI,0 ;利用DI來累計一共有多少個數(shù)字
L5:
MOV CX,10
CALL DIVDW
ADD CL,30H
MOV DS:[SI],CL
CMP AX,0
JZ L6
INC SI
INC DI
JMP L5
L6:
MOV DL,DS:[SI]
MOV AH,2
INT 21H
CMP DI,0
JZ OK
DEC SI
DEC DI
JMP L6
OK:
MOV AX,4C00H
INT 21H
;參數(shù): (AX)=DWORD型低16位數(shù)據(jù)
; (DX)=DWORD型高16位數(shù)據(jù)
; (CX)=除數(shù)
;返回: (DX)=結(jié)果的高16位,(AX)=結(jié)果的低16位
; (CX)=余數(shù)
;32位汪神除16位,可以防止溢出!
DIVDW: ;子程序定義開始,功能是分離各個數(shù)字出來
PUSH AX
MOV AX,DX
MOV DX,0
DIV CX
MOV BX,AX
POP AX
DIV CX
MOV CX,DX
MOV DX,BX
RET ;子程序定義結(jié)束
CODE ENDS
END START
斐波那契數(shù)列是一個經(jīng)典的數(shù)列,前橋嫌螞兩項為0和1,后續(xù)項為前兩項之和,即:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
以下是C語言程序文件,用于求解小于自然數(shù)n的斐波那契數(shù)列第50項的值:
#include stdio.h
int main() {
int n = 100;? // 假設(shè)n為100
int a = 0, b = 1, c;
int i;
for (i = 2; i 50; i++) {
c = a + b;
if (c n) break;
a = b;
b = c;
}
printf("小于%d的斐波那契數(shù)列第50項為%d", n, b);
return 0;
}
解釋:
我們假設(shè)n為100,可以根據(jù)實際情況修改。
定義a=0,b=1為前兩項,c為當前項,i從2開始循環(huán),因為前兩項已經(jīng)確定。
每次循環(huán),c為a和b之和,判斷c是否大于n,如果大于,則退出循環(huán),否則將a和b往后移動一項。
輸出小于n的斐波那契數(shù)列第50項,即b。
注意:這里求的是小于n的斐波那契數(shù)列第50項,如果要求恰敏埋好等于n的斐波那契數(shù)列第幾項,需要對程序進行修改。者侍
這么物衡寫效率罩鍵做很低,沒有剪枝,存在大量的重復計算。
反正你測亮臘試用例是有限的,那我騙過你的測試用例就行了??;)