Quelle est la différence entre un retour arrière et une récursivité? Comment ce programme fonctionne?
void generate_all(int n)
{
if(n<1) printf("%s\n", ar);
else{
ar[n-1]='0'; //fix (n)th bit as '0'
generate_all(n-1); //generate all combinations for other n-1 positions.
ar[n-1]='1'; //fix (n)th bit as '1'
generate_all(n-1); //generate all combinations for other n-1 positions.
}
Cette question revient à demander quelle est la différence entre une voiture et une DeLorean.
Dans la récursivité, la fonction s’appelle jusqu’à atteindre un cas de base.
En faisant un retour en arrière, vous utilisez la récursivité pour explorer toutes les possibilités jusqu'à obtenir le meilleur résultat possible.
Peut-être un peu difficile à comprendre, je joins un texte de ici :
"Conceptuellement, vous commencez à la racine d’un arbre; l’arbre a probablement de bonnes feuilles et de mauvaises feuilles, bien que les feuilles soient toutes bonnes ou toutes mauvaises. Vous voulez obtenir une bonne feuille. À chaque nœud en commençant par la racine, vous choisissez l’un de ses enfants et vous le gardez jusqu’à ce que vous arriviez à une feuille.
Supposons que vous obteniez une mauvaise feuille. Vous pouvez revenir en arrière pour continuer la recherche d'une bonne feuille en révoquant votre choix le plus récent et en essayant l'option suivante dans cet ensemble d'options. Si vous manquez d'options, annulez le choix qui vous a amené ici et essayez un autre choix sur ce nœud. Si vous vous retrouvez à la racine sans aucune option, il n’y aura pas de bonnes feuilles à trouver. "
Cela nécessite un exemple:
Votre code est simplement de la récursivité, car vous ne récupérez jamais si le résultat ne correspond pas à votre objectif.
Recursion décrit l’appel de la même fonction que vous êtes. L’exemple typique d’une fonction récursive est la factorielle, c’est-à-dire quelque chose comme:
int fact(int n) {
int result;
if(n==1) return 1;
result = fact(n-1) * n;
return result;
}
Ce que vous voyez ici, c'est que ce fait s'appelle tout seul. C'est ce qu'on appelle la récursivité. Vous avez toujours besoin d'une condition qui empêche la récursivité. Ici, c'est if(n==1)
combiné au fait que n diminuera toujours à chaque appel (fact(n-1)
)
Backtracking est un algorithme qui tente de trouver une solution à partir de paramètres. Il construit des candidats pour la solution et abandonne ceux qui ne peuvent pas remplir les conditions. Un exemple typique de tâche à résoudre serait le Eight Queens Puzzle . Le retour en arrière est également couramment utilisé dans les réseaux neuronaux.
Le programme que vous avez décrit utilise la récursivité. Semblable à la fonction factorielle, il réduit l'argument de 1 et se termine si n <1 (car il affichera alors ar
au lieu de faire le reste).
À mon sens, le retour en arrière est un algorithme, comme tous les autres algorithmes, tels que BFS et DFS, mais la récursivité et l'itération sont des méthodes, elles sont à un niveau supérieur aux algorithmes. , ce qui est assez intuitif, mais vous pouvez aussi utiliser l'itération avec une pile, ou vous pouvez aussi penser que la récursivité et l'itération ne sont que des méthodes pour supporter vos algorithmes.