Para responder à sua pergunta específica: Não, do ponto de vista de aprendizagem de um idioma, a recursão não é um recurso. Se seu professor realmente reduziu suas notas por usar um "recurso" que ele ainda não havia ensinado, isso estava errado.
Lendo nas entrelinhas, uma possibilidade é que, ao usar a recursão, você evite usar um recurso que deveria ser um resultado de aprendizado para o curso. Por exemplo, talvez você não tenha usado iteração ou talvez tenha usado apenas for
loops em vez de usar ambos for
ewhile
. É comum que uma tarefa tenha como objetivo testar sua capacidade de fazer certas coisas e, se você evitar fazê-las, seu professor simplesmente não poderá conceder a você as notas reservadas para esse recurso. No entanto, se essa foi realmente a causa de suas notas perdidas, o professor deve considerar isso como uma experiência de aprendizagem própria - se a demonstração de certos resultados de aprendizagem for um dos critérios para uma tarefa, isso deve ser explicado claramente aos alunos .
Dito isso, concordo com a maioria dos outros comentários e respostas de que a iteração é uma escolha melhor do que a recursão aqui. Existem algumas razões e, embora outras pessoas as tenham tocado em alguma extensão, não tenho certeza se elas explicaram completamente o que está por trás delas.
Stack Overflows
O mais óbvio é que você corre o risco de receber um erro de estouro de pilha. Realisticamente, o método que você escreveu é muito improvável de realmente levar a um, uma vez que um usuário teria que fornecer uma entrada incorreta muitas vezes para realmente acionar um estouro de pilha.
No entanto, uma coisa a ter em mente é que não apenas o método em si, mas outros métodos superiores ou inferiores na cadeia de chamadas estarão na pilha. Por causa disso, engolir casualmente o espaço disponível na pilha é uma coisa muito indelicada para qualquer método. Ninguém quer ter que se preocupar constantemente com o espaço livre da pilha sempre que escrever código, devido ao risco de que outro código possa ter usado muito dele desnecessariamente.
Isso faz parte de um princípio mais geral em design de software chamado abstração. Essencialmente, quando você liga DoThing()
, tudo o que você precisa se preocupar é que a coisa está feita. Você não deve se preocupar com os detalhes de implementação de como isso é feito. Mas o uso ganancioso da pilha quebra esse princípio, porque cada pedaço de código precisa se preocupar com quanta pilha pode assumir com segurança que sobrou para ela por código em outro lugar na cadeia de chamadas.
Legibilidade
O outro motivo é a legibilidade. O ideal que o código deve aspirar é ser um documento legível por humanos, onde cada linha descreve simplesmente o que está fazendo. Use estas duas abordagens:
private int getInput() {
int input;
do {
input = promptForInput();
} while (!inputIsValid(input))
return input;
}
versus
private int getInput() {
int input = promptForInput();
if(inputIsValid(input)) {
return input;
}
return getInput();
}
Sim, ambos funcionam e, sim, são muito fáceis de entender. Mas como as duas abordagens podem ser descritas em inglês? Eu acho que seria algo como:
Vou solicitar a entrada até que a entrada seja válida e, em seguida, retornarei
versus
Vou pedir uma entrada, então, se a entrada for válida, eu a retornarei, caso contrário, obtenho a entrada e retorno o resultado dela.
Talvez você possa pensar em uma formulação um pouco menos desajeitada para o último, mas acho que sempre descobrirá que o primeiro será uma descrição mais precisa, conceitualmente, do que você está realmente tentando fazer. Isso não quer dizer que a recursão seja sempre menos legível. Para situações em que ela brilha, como travessia de árvore, você poderia fazer o mesmo tipo de análise lado a lado entre a recursão e outra abordagem e quase certamente descobriria que a recursão fornece um código que é mais claramente autodescritivo, linha por linha.
Isoladamente, ambos são pequenos pontos. É muito improvável que isso realmente leve a um estouro de pilha, e o ganho em legibilidade é mínimo. Mas qualquer programa será uma coleção de muitas dessas pequenas decisões; portanto, mesmo que isoladamente elas não importem muito, é importante aprender os princípios por trás de sua execução.