遞歸過程調(diào)用本身。有兩種類型:直接和間接的遞歸。在直接遞歸過程調(diào)用和間接遞歸,第一個程序調(diào)用了第二個過程,這反過來調(diào)用的第一個程序。
遞歸被發(fā)現(xiàn)許多的數(shù)學算法。例如,考慮的情況下,計算一個數(shù)的階乘。一個數(shù)的階乘是由下式給出:
Fact (n) = n * fact (n-1) for n > 0
例如:5的階乘是1×2×3×4×5=5×4的階乘,并顯示一個遞歸的過程,這可能是一個很好的例子。每一個遞歸算法必須有一個結(jié)束條件,即滿足某種條件時,應停止遞歸調(diào)用的程序。階乘算法結(jié)束條件的情況下,當n為0時,就結(jié)束了。
下面的程序顯示了如何階乘n的匯編語言實現(xiàn)。為了保持程序簡單,我們將計算階乘3。
section .text global _start ;must be declared for using gcc _start: ;tell linker entry yiibai mov bx, 3 ;for calculating factorial 3 call proc_fact add ax, 30h mov [fact], ax mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov edx,1 ;message length mov ecx,fact ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel proc_fact: cmp bl, 1 jg do_calculation mov ax, 1 ret do_calculation: dec bl call proc_fact inc bl mul bl ;ax = al * bl ret section .data msg db 'Factorial 3 is:',0xa len equ $ - msg section .bss fact resb 1
上面的代碼編譯和執(zhí)行時,它會產(chǎn)生以下結(jié)果:
Factorial 3 is: 6