PDA

View Full Version : تابع فیبوناچی



mamad64bit
چهارشنبه 24 تیر 1388, 12:08 عصر
تابع فیبوناچی به روش بازگشتی کسی میدونه چه شکلی میشه نوشت ؟

kiuhnmgtrdcv
چهارشنبه 24 تیر 1388, 12:27 عصر
البته مثل همیشه این کدی که نوشتم ایراد داره ولی از لحاظ منطقی روند کلی همینطوری هست


.model small
.code
main:
push ds,0
push 0

PUSH 8
call fib
ret

fib proc
PUSH BP
MOV BP, SP
MOV BX, [BP+4] ; N
CMP BX, 0
JNE notzero
MOV AX,0
JMP exit
notzero:
CMP BX,1
Jne else
MOV AX,1
JMP exit
else:
DEC BX ; N-1
PUSH BX
CALL fib
MOV DX, AX
POP BX

PUSH DX
DEC BX ; n-2
PUSH BX
CALL fib
POP BX
POP DX
ADD AX, DX ; fib(n-1) + fib (n-2)

exit:
pop bp
ret
endp
end

mamad64bit
چهارشنبه 24 تیر 1388, 12:32 عصر
میشه در مورد تابع بازگشتی بیشتر توضیح بدید

kiuhnmgtrdcv
چهارشنبه 24 تیر 1388, 12:35 عصر
دوستان از من اطلاعات بیشتری دارند ولی این ناچیز دانسته های من
در نوشتن تابع بازگشتی باید به این نکته توجه کنیم که برخلاف سایر توابع که اخرشون به تعداد پارامترها ret میکردیم اینجا فقط یک ret خواهیم داشت
در تابع بازگشتی چون یک تابع درون یک تابع دیگر صدا زده میشه باید بعد از صدا زدن ان تابع در صورت داشتن پارامتر به تابع و push کردن انها به تعداد push ها pop هم کنیم یا به مقدار push ها به sp اضافه کنیم من خودم روش اول ترجیح میدم چون اصلاعات بیشتری میشه کسب کرد




proc sample
push bp
push bp,sp

push ax,[bp+6]
push bx,[bp+4]

push ax
dec ax
push ax
call sample
pop cx
pop ax

یا

push ax
dec ax
push ax
call sample
add sp,4

اگر سه تا پارامتر داشتیم
add sp,6

Open-Source
چهارشنبه 24 تیر 1388, 19:13 عصر
این به زبان C++



//*************** Fibonacci **************
//****************************Show Number In Series(1,1,2,3,5,8,13,21,...)
# include <iostream.h>
# include <conio.h>

//-----------------------------------------------
int fib(int n){
if (n<=2) return(1); else return(fib(n-2)+fib(n-1));
}
//------------------------------------------------

void main(){
clrscr();

int n;
cout<<"Enter N: ";
cin>>n;
cout<<"\n\nFibonacci Series: "<<fib(n);

getch();
}