Pour répondre à votre question: Non, du point de vue de l'apprentissage d'une langue, la récursivité n'est pas une fonction. Si votre professeur vraiment ancrée vous des marques à l'aide d'une "fonctionnalité" il n'avait pas enseigné, et pourtant, c'était mal.
En lisant entre les lignes, il est possible qu'en utilisant la récursivité, vous avez évité jamais à l'aide d'une fonctionnalité qui était censé être un résultat d'apprentissage pour son cours. Par exemple, peut-être que vous n'utilisez pas d'itération à tous, ou peut-être que vous ne l'utilisiez for
boucles au lieu d'utiliser les deux for
et while
. Il est courant qu'une cession a pour but de tester votre capacité de faire certaines choses, et si vous évitez de les faire, votre professeur tout simplement ne peut pas vous accorder les marques de mettre de côté pour cette fonction. Cependant, si cela était vraiment la cause de votre perte de repères, le professeur doit prendre cela comme une expérience d'apprentissage de son propre si de démontrer certains résultats de l'apprentissage est l'un des critères pour une mission, qui doit être clairement expliqué aux élèves.
Cela dit, je suis d'accord avec la plupart des autres commentaires et les réponses que l'itération est un meilleur choix que la récursion. Il ya un couple de raisons, et tandis que d'autres personnes ont abordé dans une certaine mesure, je ne suis pas sûr qu'ils ont entièrement expliqué la pensée derrière eux.
Les Débordements De Pile
La plus évidente est que vous risquez d'obtenir une erreur de dépassement de pile. De façon réaliste, la méthode que tu as écrit est très peu probable effectivement conduire à un, puisqu'un utilisateur aura à donner mauvaise saisie à plusieurs reprises de déclencher un débordement de pile.
Cependant, une chose à garder à l'esprit est que non seulement la méthode elle-même, mais d'autres méthodes plus ou moins dans l'appel de la chaîne sera sur la pile. De ce fait, en passant engloutir à disposition d'espace de pile est assez impoli chose pour n'importe quelle méthode pour le faire. Personne ne veut avoir à constamment se soucier d'espace libre pile à chaque fois qu'ils écrivent du code, en raison du risque que d'autres code peut avoir utilisé inutilement beaucoup d'elle.
Cette est une partie d'un principe plus général dans la conception de logiciels appelé l'abstraction. Essentiellement, lorsque vous appelez DoThing()
, tous vous avez besoin à prendre en compte est que la Chose est faite. Vous ne devriez pas avoir à vous soucier de la mise en œuvre des détails de la façon dont c'est fait. Mais gourmand utilisation de la pile des sauts de ce principe, parce que chaque morceau de code s'inquiéter de la façon dont beaucoup de la pile, il est raisonnable de supposer qu'il a laissé par le code d'ailleurs dans la chaîne d'appel.
La lisibilité
L'autre raison est la lisibilité. L'idéal ce code doit aspirer à être un homme-document lisible, où chaque ligne décrit simplement ce qu'il fait. Ces deux approches:
private int getInput() {
int input;
do {
input = promptForInput();
} while (!inputIsValid(input))
return input;
}
rapport
private int getInput() {
int input = promptForInput();
if(inputIsValid(input)) {
return input;
}
return getInput();
}
Oui, ces deux travaux, et oui ils sont à la fois assez facile à comprendre. Mais comment les deux approches décrites en anglais? Je pense que ce serait quelque chose comme:
Je vous invite pour l'entrée jusqu'à l'entrée est valide, puis le retourner
rapport
Je vous invite pour l'entrée, puis si l'entrée est valide, je vais le retourner, sinon je vous l'entrée et renvoie le résultat au lieu
Vous pouvez peut-être penser un peu moins maladroit de formulation pour le dernier, mais je pense que vous trouverez toujours que la première va être une description plus précise, sur le plan conceptuel, de ce que vous êtes en train d'essayer de faire. Ce n'est pas dire que la récursivité est toujours moins lisible. Pour les situations où il brille, comme l'arbre transversal, vous pourriez faire le même genre de côté par côté d'analyse entre la récursivité et d'une autre approche et vous auriez presque certainement trouver la récursivité donne le code qui est plus clairement d'auto-description, ligne par ligne.
Dans l'isolement, ces deux sont les petits points. Il est très peu probable que cela aurait jamais vraiment conduire à un débordement de la pile, et le gain en lisibilité est mineur. Mais n'importe quel programme va être une collection de beaucoup de ces petites décisions, de sorte que même si dans l'isolement, ils n'ont pas d'importance, il est important de connaître les principes qui sous-tendent l'obtention de leur droit.