... :oops:Citation:
Envoyé par PRomu@ld
Version imprimable
... :oops:Citation:
Envoyé par PRomu@ld
Et pourquoi il n'y aurait pas des tours à Hawaï :twisted:
Qu'entends-tu par linéarisable? Oui, il est possible de faire une version non récursive de toute fonction récursive, maisCitation:
Envoyé par méphistopheles
* pour ce faire on a besoin pour certaines d'entre elles d'utiliser une pile
* on n'arrive pas pour autant à un comportement linéaire.
Variable est un peu trop vague; tellement vague que je peux prétendre programmer n'importe quel algo en n'ayant besoin que d'une seule variable d'un type convenablement choisi :-)Citation:
Envoyé par méphistopheles
Essaie de faire une implémentation non récursive du quick sort sans avoir besoin d'une quantité de mémoire proportionnelle à la profondeur d'appel maximale de la version récursive.
Ça m'intéresse. Aurais-tu un pointeur? La fonction rechercher m'indique qu'il y a des messages mais ils n'ont plus l'air accessible et je n'arrive pas à les retrouver dans le cache de google.Citation:
Envoyé par Trap D
Je pense qu'il faudrait demander au modérateur du forum de les ressortir. Il me semble que quelqu'un était "presque" arrivé à une solution, mais je n'en suis pas sûr.
disons pour préciser, des variables du même type que celles utilisées dans la procédure récursive: si je n'ai une variable d'appel "entiére" dans ma récursive, je dois n'avoire que des variables de type entier, et non pas des listes d'entiers où autres tableus permettants de stocker à peu-pres n'importe quoi.Citation:
Envoyé par Jean-Marc.Bourguet
en prenant un exemple simple et concret:
une fonction du calcul du cosinus consiste à faire une fonction récursive du type:cette fonction peut se linéariser de la ma,ière suivante:Code:
1
2 fonction cos(variable: n) si n< précision alors renvoyer n sinon, renvoyer 2(cos (n/2))^2 -1
ici, elle est évidente mais dans d'autres cas, on est tenté de stocker des valeurs dans un tableau pui de les resortirs en "remontant " la récursiviter, ce qui consiste à faire une "pile manuelle".Code:
1
2
3
4
5
6
7
8
9
10 fonction cos(variable: n) a:=0 tant que n>précision n:=n/2 a:=a+1 boucler. pour n depuis 0 jusqu'a a : n:=2n^2-1 boucler renvoyer n
salut :wink:
Je n'ai aucun problème à transformer une récursivité terminale en itération; je peux même le faire pour les récursivités non terminales ayant besoin d'une variable d'accumulation (cas typique, la factorielle exprimée de manière récusive) ou d'autres cas particuliers. J'ai pratiqué assez les langages fonctionnels pour savoir que les compilateurs pour ces langages sont même capables de faire certaines de ces transformations tout seul et je m'y connais assez en compilation pour avoir une assez bonne idée comment faire un tel compilateur.Citation:
Envoyé par méphistopheles
Mais ces méthodes ne sont pas générales (en particulier je ne vois pas de méthodes applicables quand il y a plusieurs appels récursifs même si certains cas sont faisables) et j'ai dans mes cartons un certain nombre d'algos (je t'en ai donné un comme défi, je peux t'en sortir d'autres, en particulier sur les graphes mais si tu résous ce défi je pense être capable de faire la transformation moi-même) pour lesquels je doute qu'il y ait une implémentation itérative n'ayant pas besoin d'espace auxilliaire proportionnel à la profondeur d'appel maximale de la version récursive.
Ce genre de recherche n'est pas particulièrement dans mon domaine, mais le résultat que tu prétends exister me surprend tellement que j'aimerais une référence.
Edit : Autant retirer cette partie, je n'y avait raconté que des conneries ^^'..
Pour la complexité des algorithmes récursifs de type "Diviser pour Régner", on peut utiliser le Théorème Maître (Master Theorem) :Citation:
Envoyé par méphistopheles
T(n) = a * T(n/b) + f(n)
où :
- T(n) est la complexité de l'algorithme récursif
- a le nombre de sous-problèmes et n/b la taille de chacun de ces sous-problèmes lors de l'étape appelée "Régner"
- f(n) la complexité des étapes "Diviser" et "Combiner" (hors appels récursifs)
Bien sûr que si !Citation:
Envoyé par Sib
f(n) = O(g(n)) signifie :
Il existe N tq Pour tout n > N, Il existe A > 0 tq f(n) <= A * g(n)
Donc tout algorithme en O(n) est aussi en O(n^2) !!
--
Jedaï
Ouhla.. Aux temps pour moi....Citation:
Envoyé par Jedai
Ya vraiment des jours où je ferais mieux de.... me taire..
/me slaps himself..