mark86 (Normal User)
Newbie
Messaggi: 1
Iscritto: 31/01/2011
|
1) E(n, k) = (n − k + 1)E(n − 1, k − 1) + kE(n − 1, k)
il mio programmino deve fare questo:
void main (m){
inserisci m
if m>=0 {
for x= 1 to m do {
print “E(m,x)” :
print Eulerian(m,x);
print “/n”;
}
}else{
Stampa errore inserimento m
}
}
function Eulerian(n,k){
if (k=1) return 1
if (k>n) return 0
T1= (n-k+1)* Eulerian(n-1, k-1) + k* Eulerian(n-1, k)
return T1
}
quando lo traduco in Assembly , la ricorsiva mi da problemi.ora la posto:
eulerian:
addi $sp, $sp, -32 # creo lo spazio nello stack
sw $ra, 0($sp) # salvo return address
sw $a0, 4($sp) # salvo il valore di k in a0 sullo stack
sw $a1, 8($sp) # salvo $a1 salvo il valore di n
sw $a2, 12($sp) # salvo $a2
sw $a3, 16($sp) # salvo $a3
ble $a0,1,equal_1
# calcolo il primo blocco : (n - k + 1)E(n - 1, k -1) #
# E(n-1,k-1)
addi $a0, $a0, -1 # decremento k di 1 ----> k-1
addi $a1, $a1, -1 # decremento n di 1 ----> n-1
jal eulerian # calcolo E(n - 1, k -1)
# $v0 = E(n - 1, k -1)
#(n-k+1)
lw $a0, 4($sp) # riprendo il valore di k dallo stack
lw $a1, 8($sp) # riprendo il valore di n dallo stack
sub $a1, $a1, $a0 # decremento n di k
addi $a3, $a1, 1 # $a3= n-k+1
mul $a2,$a3,$v0 # $a2=(n - k + 1)E(n - 1, k -1)
move $a3, $a2 # sposto in $a3 il contenuto di $a2
sw $a3, 16($sp) # salvo $a3 sullo stack
# calcolo il secondo blocco : kE(n - 1, k) #
lw $a0, 4($sp) # riprendo il valore di k dallo stack
lw $a1, 8($sp) # riprendo il valore di n dallo stack
addi $a1, $a1, -1 # decremento n di 1 ----> n-1
addi $a0,$a0, 0 # lascio il k così com'è
jal eulerian # calcolo E(n - 1, k)
# $v0 = E(n - 1, k )
lw $a0,4($sp) # riprendo il valore di k dallo stack
mul $a2, $a0, $v0 # calcolo kE(n - 1, k)
sw $a2,12($sp)
lw $a2,12($sp)
lw $a3, 16($sp) # riprendo il primo blocco dallo stack
add $a3, $a3, $a2 # sommo (n - k + 1)E(n - 1, k -1) con kE(n-1, k)
move $v0, $a3 # sposto risultato totale in $v0
j end # Salta alla procedura di ripristino dello stack
equal_1:
li $v0, 1 # salvo 1 in $v0
end:
# Ripristina valori dello stack
lw $a3, 16($sp) # ripristina i valori sullo stack
lw $a2, 12($sp) #
lw $a1, 8($sp) #
lw $a0, 4($sp)
lw $ra, 0($sp)
addi $sp, $sp, 32 # ripristino $sp
jr $ra # ritorno ricorsione
non riesco a trovare l'errore........x' quando richiamo la ricorsiva nel 2°blocco mi va in loop.........qualcuno mi può aiutare per favore?
|