mercredi 13 février 2008

Itératif ou récursif ?

Dans la série des questions que je me pose parfois sur la programmation, il y a celle de l'opposition entre méthode itérative et méthode récursive... Dans le cas général, y en a-t-il une de préférable ? Seulement dans certains cas ? Pourquoi ? Laquelle est la plus rapide ? La plus claire ? Etc... Comme ça fait un moment que j'ai envie de découvrir tranquillement le paradigme fonctionnel, ça me parait être des interrogations justifiées.

Pour le cas de Ruby, je peux déjà répondre à la question de la vitesse d'exécution sur le cas trivial de la fonction factorielle grâce à ce petit benchmark :



# Benchmark : recursive vs iterative
# on factorial function

# Recursive version
def factor_rec num
if num == 0
1
else
factor_rec(num-1)*num
end
end

# Iterative version
def factor_iter num
res = 1
(1..num).each do |i|
res *= i
end
res
end

# Benchmark
require 'benchmark'

Benchmark.bm(9) do |timer|
timer.report('Recursive') {
for i in (0...1000)
factor_rec i
end
}
timer.report('Iterative') {
for i in (0...1000)
factor_iter i
end
}
end

#=>
# user system total real
#Recursive 4.266000 0.062000 4.328000 ( 4.328000)
#Iterative 3.312000 0.016000 3.328000 ( 3.360000)

0 commentaires: