View Single Post
Old 31-10-2005, 11:30   #4
bottomap
Member
 
Iscritto dal: Feb 2005
Città: Prato
Messaggi: 149
Ciao,

Qual'è esattamente il problema? La ricorsione in sé, la formula in particolare o la sua implementazione in asm?

La struttura (pesudocodice poco ottimizzato 386+ di quello che chiedi) dovrebbe essere all'incirca:

diciamo che in eax hai n, immagino che la ricorsione si arresti per n==2, il risultato sarà sempre in eax. D(1) e D(0) non so esattamente quanto possano valere, in caso il codice dovrà essere leggermente modificato... quello che posto ritorna 0 in questi due casi. Ovviamente non faccio niente ai registri (push/pop/impostazione di uno stack frame e simili), in caso dovrai provvedere tu...

ricors_proc

mov ebx,eax //Salvo n

cmp eax,2
jle tornaZero

dec eax //prendo n-1
call ricors_proc
mov ecx,eax //salvo D(n-1)

mov eax,ebx //Riprendo n
sub eax,2 //o due dec
call ricors_proc
add ecx,eax //in ecx ho D(n-1)+D(n-2)

xchg eax,ecx //scambio ecx con eax
dec ebx //riprendo n-1 (ebx non mi serve più)
mul ebx //moltiplico eax*ebx (n-1)*(D(n-1)+D(n-2))
jmp esci

tornaZero:
xor eax,eax
esci:
ret
ENDP

Ovviamente trasformarlo in asm 8086 non è difficile (occhio alla moltiplicazione, comunque), trasformarlo in MIPS o altri asm può richiedere un po' di lavoro in più visto che in asm x86 il primo operando è la destinazione dell'operazione e che i nomi dei registri sono diversi...

Ciaociao
__________________
Venite a visitarci qui:http://www.bottomap.com
Bottomap is a proud Masterdrive.it moderator
bottomap è offline   Rispondi citando il messaggio o parte di esso