Olá, estou desenvolvendo um programa de fibonacci, para aprender na pratica um pouco sobre desempenho, e estou tentando desenvolver um que alcançe numeros cada vez maiores. Primeiro usei um metodo recursivo, que achei no java como programar, so que so depois de 50 começava a dar erro de StackOverFlow.
Então resolvi quardar os resultados em um array, dai consegui chegar ate 1000.
Depois resolvi fazer o programa calcular todos, do 0 até o numero escolhido, para acabar com o StackOverFlow. O Programa chegou ate 10.000.
Depois disso ví que o problema não era processamento, e sim muita coisa na memoria. Resolvi que a cada vez que o fibonacci achava mais um numero, deveria apagar o bigInteger que ficava dois atrás, que não seria mais util.
Apos saber fibonacci 5, pode se apagar fiboancci 3, já que o 6, so vai ter que saber quanto é o 4 + o 5. Isso ajudou e agora o programa pode calcular qualquer resultado, o que as vezes pode demorar. Vou postar o codigo
import java.util.Scanner;
import java.util.InputMismatchException;
import java.util.NoSuchElementException;
import java.math.BigInteger;
public class FibonacciSequence
{
public static BigInteger fibonacci( int n )
{
BigInteger[] sequence;
sequence = new BigInteger[n + 1];
for ( int c = 0 ; c < n + 1 ; ++c )
{
if ( c == 0 || c == 1 )
sequence[c] = new BigInteger( Integer.toString( c ) );
else
{
sequence[c] = sequence[c - 1].add( sequence[c - 2] );
sequence[c - 2] = null;
if ( c %( n / 100 ) == 0 )
System.out.printf( "\r%d%%", c / ( n / 100 ) );
}
}
System.out.println();
return sequence[n];
}
public static void main( String args[] )
{
Scanner input = new Scanner( System.in );
int choice = 0;
boolean read = false;
System.out.print( "Insira o número da sequencia de fibonacci desejado: " );
do
{
try
{
choice = input.nextInt();
read = true;
}
catch( InputMismatchException e )
{
System.out.printf( "Error reading the number..." );
}
catch( NoSuchElementException e )
{
System.out.printf( "Error reading the number..." );
}
}while ( read == false );
try
{
System.out.print( fibonacci( choice ) );
}
catch( OutOfMemoryError e )
{
System.out.printf( "Not enought Memory available... Program will finish." );
System.exit( 1 );
}
}
}
Eu gostaria de ver se alguem pode me ajudar com algumas duvidas:
Uma variavel ocupa espaço? Ou é so o valor delas? Um bigInteger null vai ocupar alguma memoria?
Eu testar todos os valores para saber se tem resto 0 ( Para imprimir na tela a porcentagem concluida ) ocupa algum processamento significativo?
++a é mais rapido que um a++ em um cabeçalho de for?
Exista algo que eu possa fazer para aumentar o desempenho e a velocidade do processamento desse programa?
Obrigado a todos