Jump to content
black

factorial recursivo

Recommended Posts

black

Boas pessoal,

Para estudo de uma disciplina tenho como exercício ler um inteiro positivo e escreve o valor do seu factorial de forma RECURSIVA...

comecei a pensar numa forma de resolver e fiz da seguinte forma:

#include<stdio.h>
#include<conio.h>

int fact(int n, int i=1) {
                if(n==0) {
                               return i;
                } else {
                               i = n*i;
                               return fact(n-1, i);
                }
}


main()
{ 
      int n;
printf("numero: ");
scanf("%d",&n);
printf("O factorial e: %d ",fact(n));

    getch();
}

porem depois de algumas perguntas descobri que realmente isto esta bem porem não é o pedido neste estudo. Pois não posso utilizar argumentos opcionais (int fact(int n, int i=1)), tenho que fazer no main com com apenas um if e um return.

Ja estudei varias hipóteses porem não consigo chegar a uma solução. Era que alguém me pode ajudar?

desde já obrigado, cumprimentos...


.:: C ::. .::Haskell::. .::VB::. .::PHP::.

Share this post


Link to post
Share on other sites
Localhost

Não entendi a dúvida. Queres simplificar a tua função fact, é isso?

A maneira mais simples que encontro é com o operador ternário:

return n == 1 ? n: n * fact (n - 1);

Assim só precisas de um argumento na função.


here since 2009

Share this post


Link to post
Share on other sites
black

nao, eu nao posso usar a funçao fact.. tenho que fazer tudo dentro do main... com apenas um if e um return... mas nao sei como é possivel...


.:: C ::. .::Haskell::. .::VB::. .::PHP::.

Share this post


Link to post
Share on other sites
bubulindo

Se só podes usar uma função, a main(), como podes fazer algo recursivamente?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Localhost

Certamente interpretaste mal o enunciado/problema/whatever.

Para além de criar uma solução do factorial, recursivamente, na função main não ser possível, não é standard fazer chamadas recursivas à função main.


here since 2009

Share this post


Link to post
Share on other sites
Diutsu

tens mesmo de usar uma função extra, para poderes enviar o valor que estás a calcular, usando apenas o main não consegues fazer isso.


XX SINFO - Semana Informática

Share this post


Link to post
Share on other sites
daj

Já agora,

/* internal factorial function. */
int fact_i(int n, int i) {
  return n == 0 ? i : fact_i(n-1, n*i);
}

int fact(int n) {
  return fact_i(n, 1);
}

Que é interessante de contemplar em comparação com a solução do Localhost porque é um procedimento recursivo que gera um processo iterativo e que, sendo a chamada recursiva dentro do fact_i uma tail call, pode ser optimizada pelo compilador para utilizar sempre a mesma stack frame. Não me alongo muito mais porque me arrisco a mostrar que não percebo na realidade nada disto. Para quem quiser ler o clássico SICP, ver http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.