fundo
在计算科学中有一个著名的例子,斐波那契数列(fabnacci)序列,它是考察我们递归思想的运用。
Vamos descrever resumidamente que F (n) satisfaz as seguintes condições:
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.