Como responder a versão java da sequência fabnacci de Fibonacci na entrevista?

fundo

在计算科学中有一个著名的例子,斐波那契数列(fabnacci)序列,它是考察我们递归思想的运用。

Como responder a versão java da sequência fabnacci de Fibonacci na entrevista?

Vamos descrever resumidamente que F (n) satisfaz as seguintes condições:

Como responder a versão java da sequência fabnacci de Fibonacci na entrevista?

Quando n = 0, F (n) = 0

Quando n = 1, F (n) = 1

Quando n> 1, F (n) = F (n-1) + F (n-2).

Por exemplo, a matriz de F (n) começa em 0 ..... n

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 。。。。

Então, como conseguir isso? Vamos dar uma olhada

implementação java

1. Duas camadas de recursão

O tipo mais simples de realização:

 public static long fibonacci(int n){
 if(n==0) return 0;
 else if(n==1) return 1;
 else
 return fibonacci(n-1)+fibonacci(n-2);
 }

O problema é: conforme o valor de n aumenta gradualmente, o tempo e o espaço são consumidos em demasia e os leitores podem experimentar por si próprios. Torna-se insuportável quando n = 50 na minha máquina.

2. Uma camada de recursão

Considere o método de otimização

 public static void main(String[] args) {
 long tmp=0;
 // TODO Auto-generated method stub
 int n=10;
 Long start=System.currentTimeMillis();
 for(int i=0;i<n;i++){
 System.out.print(fibonacci(i)+" ");
 }
 System.out.println("-------------------------");
 System.out.println("耗时:"+(System.currentTimeMillis()-start));
 }

public static long fibonacci(int n) {
 long result = 0;
 if (n == 0) {
 result = 0;
 } else if (n == 1) {
 result = 1;
 tmp=result;
 } else {
 result = tmp+fibonacci(n - 2);
 tmp=result;
 }
 return result;
 }

Tempo de recursão reduzido para menos de 50%

3. Sem recursão

A melhor maneira de fazer isso é não usar recursão.

 public static long fibonacci(int n){
 long before=0,behind=0;
 long result=0;
 for(int i=0;i<n;i++){
 if(i==0){
 result=0;
 before=0;
 behind=0;
 }
 else if(i==1){
 result=1;
 before=0;
 behind=result;
 }else{
 result=before+behind;
 before=behind;
 behind=result;

 }
 }
 return result;
 }

resumo

O entrevistador pode examinar este tópico: 1. Você está familiarizado com implementações recursivas básicas? O pensamento recursivo é a ideia mais básica em ciência da computação. 2: Existe uma ideia de otimização para reduzir o número de recursões através da conversão da complexidade do tempo e do espaço. 3: Se não deve atingir recursão no final para melhorar muito a eficiência da computação.

Acho que você gosta

Origin blog.51cto.com/15015181/2556411
Recomendado
Clasificación