web-dev-qa-db-fra.com

Quelle est la différence entre l'itération et la récursivité?

Quelle est la différence entre iteration et recursion et pourquoi/quand est-il préférable:

while (true) {
    // Iterating
}

Et

private void recursion() {
    if (true)
        recursion(); // Recursing

    return;
}

Je vois beaucoup d'implémentation de recursive alors que cela pourrait être fait facilement dans une simple boucle.

19
h0ussni

Il existe deux différences principales entre la récursivité et une version itérative du même algorithme.

Tout d'abord, il est parfois préférable de comprendre un algorithme récursif qu'un algorithme itératif (du moins si vous êtes un programmeur expérimenté) .Cela augmente donc l'expressivité et dans certains cas la lisibilité )

L'expressivité est une énorme affaire sur les langages de programmation et être capable d'écrire le même code sur 5 lignes au lieu de 20 est une affaire énorme.

À la baisse, cela diminue les performances de votre code. Les fonctions récursives doivent conserver les enregistrements de fonction en mémoire et passer d'une adresse mémoire à une autre pour être invoquées pour passer des paramètres et renvoyer des valeurs. Cela les rend très mauvais en termes de performances.

Résumé:

Algorithmes itératifs = performances rapides mais difficiles à écrire (parfois difficiles à lire aussi)

Algorithmes récursifs = rapides à écrire mais mauvaises performances (parfois plus faciles à comprendre aussi)

Prenez cet exemple:

public static long fib(long n) {
    if (n <= 1) return n;
    else return fib(n-1) + fib(n-2);
}

contre

    if ((n == 1) || (n == 2)) {
        return 1;
    } else {
        long prev = 1, current = 1, next = 0;
        for (long i = 3; i <= n; i++) {
            next = prev + current;
            prev = current;
            current = next;
        }
        return next;
    }

La source:

http://www.csd.uwo.ca/Courses/CS1027a/code/FibonacciDemo.Java

33
Iordanis

La principale différence entre la récursivité et l'itération est l'utilisation de la mémoire.

Pour chaque appel récursif, il faut de l'espace sur la trame de pile, ce qui entraîne une surcharge de mémoire.

Laisse moi te donner un exemple. Imaginez dans un cas que vous avez oublié d'écrire le cas de base pour votre fonction récursive résultant en appels récursifs sans fin et dans l'autre cas, vous avez écrit une boucle infinie.

Étant donné que chaque fonction récursive attribue un nouvel espace mémoire, dans le premier cas, votre code donnera une exception de dépassement de pile, mais dans le second cas, il continuera à fonctionner indéfiniment.

Il est donc préférable de rendre votre code itératif plus compréhensible que d'utiliser Recursion.

5
mohit verma

Ce sont des façons différentes de faire la même chose. Toutes les implémentations récursives peuvent être effectuées avec une (ou plusieurs) boucle (s) et vice versa. Il s'agit davantage de la logique derrière cela, d'une manière d'y penser. Factorielle, bien que n'étant pas le meilleur exemple, est n * (n-1)! il est donc logique de l'utiliser récursivement.

2
clcto

En théorie, vous pouvez toujours permuter entre l'itération et la récursivité. Cependant, au moins dans le cas de C/C++/C #/Java, le compilateur vous offre un support qui pourrait rendre la solution plus élégante, surtout lorsque vous ne connaissez pas le nombre de boucles auparavant.

Le meilleur exemple est de répertorier tous les fichiers d'un dossier et ses descendants. S'il existe plusieurs sous-dossiers contenant des sous-dossiers, normalement en mode itération, vous avez besoin d'une pile pour enregistrer tous les dossiers que vous devez analyser. En cas d'approche récursive, la pile est déjà fournie par le compilateur, et la solution est plus élégante.

1
AndreiM

La récursivité et l'itération sont différentes façons de penser à une solution. Il serait difficile d'expliquer en profondeur la différence dans toute sa portée. Dans votre exemple de code, vous avez déjà montré la différence. La fonction récursive est celle qui s'appelle elle-même, tandis que la fonction itérative est celle qui parcourt un bloc de code. Voici quelques articles pour vous aider à mieux les comprendre: wiki récursif

wiki d'itération

CodeProjectSO # 1

SO # 2

1
Roman

Ils peuvent être utilisés interchangeables pour résoudre différents problèmes. En substance, vous pouvez écrire des fonctions récursives de manière itérative et vice versa.

L'itération peut augmenter les performances de votre programme. Alors que la récursivité peut donner un résultat plus intuitif et élégant. Vous pouvez choisir celui que vous préférez!

0
Montaldo

Les fonctions récursives passent par le processus de s'appeler jusqu'à ce qu'une condition soit remplie tandis que l'itération utilise une structure de contrôle en boucle (par exemple while, do while, for) afin de répéter une section de code jusqu'à ce qu'une certaine condition soit remplie.

Exemple récursif:

int rec_func(int u, int k) {
  if (k == 0)
    return u;
  return rec_func(u * k, k - 1);
}

Exemple d'itération:

int ite_func(int u, int k) {
  while (k != 0) {
    u = u * k;
    k = k - 1;
  }
  return u;
} 

La seule différence réelle entre l'OMI est la différence de compilation.

0
CopyAndPaste