Exercício Fatorial

24 respostas
samanta.santos

[color=red]Bom dia, alguém pode me ajudar a fazer esse exercício?[/color]

[color=red]Imprima os fatoriais
O fatorial de um número n é n * n-1 * n-2 … até n = 1. Lembre-se de utilizar os parênteses. O fatorial de 0 é
1 O fatorial de 1 é (0!) * 1 = 1 O fatorial de 2 é (1!) * 2 = 2 O fatorial de 3 é (2!) * 3 = 6 O fatorial de 4 é (3!) *
4 = 24
[/color]

24 Respostas

latorre

O que você já tem feito?

ccefetpb

A solução recursiva é mais facil .

public int fatorial(int n) {
if ( n == 0 || n == 1)
return 1;
else
return n*fatorial(n-1);

}

Agora pensa ai como e a iterativa , e n cria forum pros outros fazerem teu trabalho de casa >=P
Acho qué isso, n testei!

Rivan_Henrique

Segue uma solução mais pobre…

public class Fatorial {
    public static void main(String[] args) {
        int a = 1, b = 1;

        System.out.print(a + " " + b + " ");

        while(a != 0){
            a += b;
            b += a;

            System.out.print(a + " " + b + " ");
            
            if (a > 100) {
                break;
            }
        }
    }
}

Obrigado!

edmarr

Afff vcs tem que deixar o cara pensar ,
o cara chega pede e vcs ja fazem
tenho certeza que ele so vai copiar e colar ,
ou seja nem vai atentar para saber como
a solução foi feita .

samanta.santos

[color=red]Gente, me desculpem. Eu tentei fazer, só que eu estava atrasada para ir embora e acabei esquecendo de colocar o meu exercicio feito e o erro que está mostrando. Então, ai esta ela:
Esse foi o que eu tentei fazer:[/color]

public class Farorial{
	public static void main(String[] args){
		int i, j, fat = 1;
		for (i = 1; i<=j;i++);
		System.out.println("Digite um numero:" + j);
	if (j <=1) return 1
	else
	return fat = j*fat(j-1);
	System.out.println("O fatorial deste numero e: " +fat)
}
}

[color=red]E o erro que está dando é esse:[/color]

C:\Samanta\exercicio java3.02\Fatorial.java:7: ';' expected
	else
        ^
C:\Samanta\exercicio java3.02\Fatorial.java:10: ';' expected
}
^
2 errors

Ferramenta concluída com código de saída 1

[color=red]Não estou consegundo entender esse erro.
Agora voces podem me ajudar sem brigar comigo? :oops:
Agradeço,gente.
E desculpe ai, de coração. Vou tomar mais cuidado da próxima vez[/color]

vitinho1712
System.out.println("O fatorial deste numero e: " +fat)

tá faltando o “;”
o correto seria assim ó:

System.out.println("O fatorial deste numero e: " +fat);
Scoobydoo

public class Farorial{ public static void main(String[] args){ int i, j, fat = 1; for (i = 1; i<=j;i++); System.out.println("Digite um numero:" + j); if (j <=1){ return 1; }else{ return fat = j*fat(j-1); System.out.println("O fatorial deste numero e: " +fat);// <---- ; }}}

leo.junior

Estão faltando 2 “;”!!!

Um é no seu “if” e o outro no “System.out…”

walissongpi

edmarr:
Afff vcs tem que deixar o cara pensar ,
o cara chega pede e vcs ja fazem
tenho certeza que ele so vai copiar e colar ,
ou seja nem vai atentar para saber como
a solução foi feita .

:wink: Justo!

vitinho1712

leo.junior:
Estão faltando 2 “;”!!!

Um é no seu “if” e o outro no “System.out…”


nem reparei no outro hauhauh

maior_abandonado

depois dessa vo criar um usuario com nome de mulher e pegar uma foto qualquer no google para sempre que precisar de alguma coisa no forum… :x

caramba passam assim exercicio de mão bejada desse jeito…por isso que sempre tem uns folgados vindo pedir para resolvermos os exercicios da faculdade deles…sempre tem quem faça mesmo…

edmarr

maior_abandonado:
depois dessa vo criar um usuario com nome de mulher e pegar uma foto qualquer no google para sempre que precisar de alguma coisa no forum… :x

caramba passam assim exercicio de mão bejada desse jeito…por isso que sempre tem uns folgados vindo pedir para resolvermos os exercicios da faculdade deles…sempre tem quem faça mesmo…


\o/

samanta.santos

Realmente estava faltando mesmo...rsrs...Mas agora o erro é outro. Está dizendo que não pode retornar um valor em que o resultado for "vazio"....
está assim:

public class Fatorial{
	public static void main(String[] args){
		int i, j, fat = 1;
		for (i = 1; i<=j;i++);
		System.out.println("Digite um numero:" + j);
	if (j <=1) return 1;
	else
	return fat = j*fat(j-1);
	System.out.println("O fatorial deste numero e: " +fat);
}
}

e o erro é esse:

C:\Samanta\exercicio java3.02\Fatorial.java:6: cannot return a value from method whose result type is void
	if (j <=1) return 1;
                          ^
C:\Samanta\exercicio java3.02\Fatorial.java:8: cannot return a value from method whose result type is void
	return fat = j*fat(j-1);
                   ^
2 errors

Ferramenta concluída com código de saída 1

[color=red]Nossa...esse negocio de java deixa qualquer iniciante de cabelos em pé!!rs[/color] :shock:

caraujocruz

2
Ajudei em um outro tópico e ainda assim fui chamado de orgulhoso porque não fiz o loop, deixei comentado como teria que ser feito.

samanta.santos

Cruzes,gente…
Vcs estão ai me esculaxando a toa. Primeiramente, eu sou mulher sim,e com muito orgulho…
E outra, eu estou tentando aprender java sozinha, sem a ajuda de ninguem. Nunca tinha aprendido isso na vida, estou vendo agora. Não tem pq vcs ficarem falando comigo desse jeito. Se um ou outro não quiser me ajudar, ao inves de falar besteira, deixe que outra pessoa me ajude.
Acho que esse forum esta ai p isso, para ajudar. Sempre que vou pedir ajuda, eu tento fazer os programas antes. Dessa vez eu esqueci de colocar, mas logo depois eu coloquei e da para ver que esta diferente do que o que o rapaz me mandou.
Isso não é para todos, agradeço a todos que estão tentando me ajudar, mas não é justo comigo uns e outros ficarem falando besteira se não estão perto de mim para ver meu esforço.

edmarr

vc deve criar um metodo retornando um int ,
dai entao vc podera usar a palavra reservada return;

leo.junior

Na verdade o erro é que vc não pode ter um “return” em um método void!!!

maior_abandonado

samanta.santos:
Cruzes,gente…
Vcs estão ai me esculaxando a toa. Primeiramente, eu sou mulher sim,e com muito orgulho…
E outra, eu estou tentando aprender java sozinha, sem a ajuda de ninguem. Nunca tinha aprendido isso na vida, estou vendo agora. Não tem pq vcs ficarem falando comigo desse jeito. Se um ou outro não quiser me ajudar, ao inves de falar besteira, deixe que outra pessoa me ajude.
Acho que esse forum esta ai p isso, para ajudar. Sempre que vou pedir ajuda, eu tento fazer os programas antes. Dessa vez eu esqueci de colocar, mas logo depois eu coloquei e da para ver que esta diferente do que o que o rapaz me mandou.
Isso não é para todos, agradeço a todos que estão tentando me ajudar, mas não é justo comigo uns e outros ficarem falando besteira se não estão perto de mim para ver meu esforço.

o problema não é você pedir ajuda, o problema é quando as pessoas querem código pronto e funcionando, ai ja é ser folgado, eu ajudo algumas pessoas aqui quando posso, mas costumo o fazer com pessoas que tentam fazer sozinhos antes de pedir ajuda, perguntam como fazer ou onde estão errados, e não querem código pronto… por causa de gente assim (não to dizendo que você seja nem que não seja) que sou contra passar codigo pronto…

a ironia com o fato de você ser mulher é por que quando quem pergunta é mulher normalmente as respostas vem muito mais rapidas, codigo pronto e testado… quando quem pergunta é homem ai a história é outra…

só para constar… você pediu ajuda, não pediu para resolverem para você como foi feito, por outro lado também não disse onde estavam suas dificuldades, não pediu nenhuma explicação.

caraujocruz:

depois dessa vo criar um usuario com nome de mulher e pegar uma foto qualquer no google para sempre que precisar de alguma coisa no forum…

caramba passam assim exercicio de mão bejada desse jeito…por isso que sempre tem uns folgados vindo pedir para resolvermos os exercicios da faculdade deles…sempre tem quem faça mesmo…

2
Ajudei em um outro tópico e ainda assim fui chamado de orgulhoso porque não fiz o loop, deixei comentado como teria que ser feito.

se for um outro tópico que acho que vi aquele la não conta…rs aquela figura la é unica…hehe

ccefetpb

=(
É verdade , não é legal ficar dando a resposta como dei , peço desculpas - entregar de mão beijada não dá.
Pois bem , vc realmente é bem iniciante em JAVA e em PROGRAMAÇÂO .
Se fosse vc eu procuraria estudar um pouquinho mais antes de tentar fazer alguma coisa por mais simples que o problema possa parecer vc cometeu um monte de erros , todos bestas - na minha opinião , principalmente pela falta de experiencia.
Um otimo livro que aconselho é o Use a Cabeça Java .
Se fosse pra apostar diria que vc ta usando o Java Como Programar , se isso for verdade saiba que esse é um livro bem completo , mas é usado principalmente pra consulta - eu nunca conheci alguem que aprendeu Java lendo aquele livro todo .
Bem , desculpe se está me achando grosso não foi essa minha intenção.
Existem muitos foruns , no GUJ mesmo que indicam bons livros pros iniciantes , dá uma olhada.
=P
Bem é isso .

samanta.santos

Vlw pela dica…Vou ver direitinho
:wink:

samanta.santos

samanta.santos:
[color=red]Bom dia, alguém pode me ajudar a fazer esse exercício?[/color]

[color=red]Imprima os fatoriais
O fatorial de um número n é n * n-1 * n-2 … até n = 1. Lembre-se de utilizar os parênteses. O fatorial de 0 é
1 O fatorial de 1 é (0!) * 1 = 1 O fatorial de 2 é (1!) * 2 = 2 O fatorial de 3 é (2!) * 3 = 6 O fatorial de 4 é (3!) *
4 = 24
[/color]

B

Vamos pelo começo:

Uma função é um conceito matemático onde você passa uma ou mais elementos para ela, números normalmente, e ela te retorna um resultado, uma para cada entrada diferente que você colocar.

Exemplo

A função F recebe um x, e te retorna um y. F(x) = y. O corpo da função F é x². Então F recebe um número x, e te retorna o quadrado dele. Isto em Java seria:

public double F (double x)
{
  double y = x * x;

  return y;
}

Aí cabe uma decontrução de coisas de linguagens de programação, como o Java. Java é uma linguagem que dizemos que tem uma tipagem estática e forte, e isto quer dizer que você define o tipo das variáveis, e o tipo de retorno de funções. No exemplo acima:

public: é um modificador de acesso da função, quer dizer que qualquer classe de fora pode acessar este método da classe.
double F: double é o tipo de retorno, que são números reais (também conhecidos como números de ponto flutuante), e F é o nome da função.
(double x): dentro do parênteses fica a declaração dos parâmetros da função, que usamos para mandar os números e outros objetos para dentro da função quando o chamamos.
{}: Entre chaves fica o corpo da função, onde se implemente o que ele faz, através de vários comandos.
double y: é uma variável de nome y com o tipo double.
return: usamos para apontar que número da função irá retornar. Depois que e dado o return, a função acaba imediatamente.

Uma observação, em Java, cada linha de comando/expressão que você usar, tem que terminar ela com ; (ponto-e-vírgula).

Outro método:

public void imprimir(double numero)
{
  System.out.println(numero);
}

De novo temos aqui é que este método não retorna nada. Para métodos que não retornam valores nós colocamos o tipo void para ele, que significa vazio. Dentro do corpo do método também não tem nenhum return, já que ele não retorna nada mesmo. O tipo void só pode user usado para métodos, variáveis sempre tem um tipo que não é vazio.

Para os dois métodos acima, os chamamos desta forma:

public void calcular()
{
  double a = F(1);
  double b = F(2);
  double c = F(3);

  imprimir(a); //imprime 1.0
  imprimir(b); //imprime 4.0
  imprimir(c); //imprime 9.0
}

Outra modalidade de funções que existem são umas que chamam elas mesmas dentro do código. Como esta:

public double G(double numero)
{
  double x = 1 + G(numero);
  
  return x;
}

Esta funcão calcula o valor dela mesma + 1. Um problema grave de funções recursivas é que elas acabam chamando elas mesmas, que chamam elas mesmas, que chamam elas mesmas, que chamam elas mesmas, sem fim. Isto vai acabar estourando a memória destinada para executar estas funções pois não tem fim. A solução é colocar um fim nelas. É o que chamamos o ponto de parada.

public double G(double numero)
{
  if (numero <= 0)
    return 0;

  double x = 1 + G(numero - 1);

  return x;
}

A modificação que fiz acima é para quando passarmos um número menor ou igual a zero, a função irá retornar um zero. Outra modificação é ir diminuindo o número repassado, para que ele chegue de poucos em poucos até a condição de parada. Se chamarmos o número 2, a função vai chamar ela mesma com o número 1, que por sua vez, irá passar um 0, e aí sim irá retornar um número de verdade. Retornando 0 para cima, a função soma este 0 com 1, e retorna 1. A função acima recebe este 1, soma com mais 1, e retorna 2. Retornando este 2, a função acaba, sem mais recursões, e volta para o programa que chamou a função originalmente.

Desta forma finalmente chegamos ao fatorial:

Então
0! é 1
1! é 0! * 1
2! é 1! * 2
3! é 2! * 3
4! é 3! * 4

A condição de parada é que quando cheguemos a zero, ele retorne 1. Então

if (numero == 0)
  return 1;

A continuação acontece para qualquer outro número maior que zero, onde fazemos que o fatorial de um número é o fatorial do número menos um, vezes o próprio número

else
  return fatorial (numero - 1) * numero;

Juntando tudo:

public int fatorial(int numero) // o fatorial de um número
{
  if (numero == 0) 
    return 1; // é 1 caso o número seja 0
  else
    return fatorial (numero - 1) * numero; // é fatorial(n-1)*n caso contrario
}

Só um aviso, só existem fatoriais de números naturais, ou seja, inteiros e positivos. Não passe um número menor que zero, ou outro número real.
Também podem ocorrer problemas se tentar fatoriais de números muito grandes, o integer do Java tem um limite de tamanho até o número 2.147.483.647.

Também há maneiras de resolver isto sem recursão.

Programa final:

public class Programa
{
   public static void main(String[] args)
   {
      Programa p = new Programa();
      
      int fatorialDe10 = p.fatorial(10);
      
      System.out.println(fatorialDe10); // imprime 3628800
   }
   
   public int fatorial(int numero) // o fatorial de um número
   {
     if (numero == 0) 
       return 1; // é 1 caso o número seja 0
     else
       return fatorial (numero - 1) * numero; // é fatorial(n-1)*n caso contrario
   }
}
j0nny

maior_abandonado:
depois dessa vo criar um usuario com nome de mulher e pegar uma foto qualquer no google para sempre que precisar de alguma coisa no forum… :x

caramba passam assim exercicio de mão bejada desse jeito…por isso que sempre tem uns folgados vindo pedir para resolvermos os exercicios da faculdade deles…sempre tem quem faça mesmo…

++

Abdon

Ola, infelizmente seu codigo esta muito errado, vou colocar aqui alguns erros que eu vejo de primeira vista:

if (j <=1) return 1  
 else  
     return fat = j*fat(j-1);  
 System.out.println("O fatorial deste numero e: " +fat);

Isto acima vai gerar um erro de compilação já que vc ou no if ou no else vai sair da função usando a palavra reservada return, logo este ultimo System.out.println nunca vai ser chamado.

int i, j, fat = 1; 
return fat = j*fat(j-1);

Aqui seu codigo faz pouco sentido, primeiro vc declara a variavel fat como um int, depois vc tenta utilizar a mesma como uma função, atribuindo o resultado a ela mesma.

fat(j-1);

O que vc deve fazer, é criar um outro método, fora do main, chamado fat, que faça esta chamada recurciva algo assim:

public static void main(String []args) {
      //instancia a classe
      System.out.println(classeInstanciada.fat(5));
}

public double fat(double value) {
    //aqui vai ter aquele seu if  (j <= 1) e a chamada recursiva da função (j*fat(j-1);)
}

Espero ter ajudado a clarear a sua mente.

Criado 23 de fevereiro de 2010
Ultima resposta 15 de mar. de 2010
Respostas 24
Participantes 14