paulo1205
(usa Ubuntu)
Enviado em 27/05/2019 - 09:40h
A causa provável é o que disse nosso colega DeuRuimDotCom. É possível que esse valor indefinido seja negativo ou que seja absurdamente grande, e isso pode provocar tantos níveis de recursividade que esgotam a memória entregue ao programa para a pilha de execução.
Como se proteger de situações como essa? Seguem algumas dicas:
1) Invoque o compilador de modo a maximizar o diagnóstico de código
Para os compiladores do GCC, use sempre, no mínimo, as opções “
-Wall -Werror -pedantic-errors -O2”. Entre outras coisas que ajudam a produzir código mais seguro, essas opções vão fazer com o compilador emita um alerta e interrompa a compilação caso ele detecte que uma variável foi usada antes de ter sido inicializada.
2) Faça com que suas funções rejeitem argumentos inválidos passados como parâmetros
Faz sentido falar em fatorial (ou hiperfatorial) de números negativos? Se não, recuse tais argumentos, sinalizando erro (no seu caso, a função poderia devolver NaN).
3) Avalie se você precisa realmente de recursividade
Recursividade é muitas vezes considerada uma forma elegante de expressar matematicamente certas construções. Contudo, no contexto de linguagens de programação imperativas como C e C++, pode vir a se mostrar muito ineficiente, tanto quanto a alocação de recursos quanto em tempo de execução. Se você não tiver de resolver o problema por recursividade, considere muito as eventuais formas não-recursivas.
Fora isso, algumas outras observações:
Procure usar para a função um nome que reflita o que ela realmente faz
“Fatorial” é um conceito matemático muito bem estabelecido. Se a sua função chamada “
fatorial” calcula algo que é diferente desse conceito bem estabelecido, você deveria trocar o nome da função.
Tem certeza de que está realmente calculando uma hiperfatorial?
Aquela operação de soma que aparece na recursividade da sua função me pareceu muito estranha numa função que tem “fatorial” como nome (ou parte do nome). Ao procurar definições de hiperfatorial, todas elas falavam em um produtório de cujos fatores têm a forma
i elevado a
i-ésima potência (em C, “
pow(i, i)”), para todo
i inteiro no intervalo fechado de
1 a
n. Assim, a função que você definiu com o nome de “
fatorial” não calcula a fatorial nem o que geralmente se conhece como
hiperfatorial, mas alguma outra coisa.
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)