je connais pas l'arm mais si tu as des fonctions c'est évident.
Si tu as pas de fonctions, tu peux toujours faire des goto...qui simulent le corps d'une fonction, et de fait, tu gères toi même ta pile d'appel+context.
Le passage du récursif à l'itératif se fait assez facilement,
- Code: Tout sélectionner
int count(n){
if (n==0){return 0}
return 1+count(n-1)
}
donne quelque chose du style
- Code: Tout sélectionner
globalCount = 0
globalStack //initialize stack properly
label: count
n = globalStack.pop //pop is removing last added element
if n==0
goto finished
globalCount +=1
globalStack.push n-1 //store parameters to explore
goto count
grossierement tu peux très bien imaginer globalStack un tableau de la taille de ton ...tableau
et une variable z qui compte la taille utilisée de ton tableau.
.push equivaut à ajouter un element (ici element c'est un int, mais tu pourrais imaginer que c'est un contexte (idem une liste de paramètres) a z+1, puis faire z++
.pop equivaut à retourner lelement à z, et faire z--
(dans les grandes lignes juste faire gaffe aux index)
c'est pas très générique, mais ca devrait faire son taff pour ton problème
(c'est pas générique, parce que on a pas besoin de sauvegarder le contexte de la fonction (idem on attend pas le retour de la fonction qu'on appèle), ya un nom quand tu fais l'appel récursif dans le return, mais j'ai oublié...)