Vamos falar sobre por que escrevi isso primeiro. Quando fui para a entrevista, fui à cidade de entrevista designada de Alibaba às 11 horas antes da entrevista e encontrei um hotel e fiquei por volta das 13 horas. , que levou diretamente aos maus resultados da entrevista no dia seguinte (para os grandes camarões que procuram um emprego não devem dizer uma tragédia aos camarões. Ainda é muito importante se preparar com antecedência). Uma hora (quando voltei da entrevista, fiquei quase dormindo quando caminhei, triste !!) Quando a entrevista estava prestes a terminar, o entrevistador me fez a pergunta sobre a sequência de Fibonacci. E eu sabia que eu tinha que definir três variáveis ou inicializar com a lista Fim, só posso escrever o seguinte método na indução passo a passo do entrevistador. Período dourado para reforma e mineração de ouro (você pode ir rapidamente se tiver a capacidade). Com o lixo, para análise de dados, o Alibaba pode analisar os diversos dados detalhados do usuário que ele dominaram e pode localizar melhor os gostos e as necessidades dos usuários, proporcionando melhor pressão precisa. Se o sonho futuro de Tencent é ser a água, a eletricidade e o gás na vida dos usuários, então o possível sonho futuro de Alibaba é a comida, roupas, moradias e transporte e água, eletricidade e gás do usuário, etc. O (∩_∩) O ~ Vamos voltar para o tópico.
Para excelentes designers de algoritmos, há apenas duas coisas para se preocupar com base na implementação do corpo da função do programa: uma é a complexidade do tempo do algoritmo de design, e o outro é a complexidade do espaço (para ser franco, é O tempo e a memória usados para executar um programa e a quantidade de memória ocupada por ele. Os requisitos, geralmente trocam recursos de espaço para objetos de tempo ou usados geralmente residem na memória para melhorar o tempo de resposta (tecnologia de cache e a maioria dos bancos de dados NOSQL mais populares são usados). Para sistemas incorporados.
Vamos falar sobre as três implementações da série Febonasi.
Primeiro, vamos falar sobre a sequência Febonasi:
Do ponto de vista textual, a sequência de Fibonacci começa com 0 e 1, e o coeficiente de Fibonacci subsequente é adicionado pelos dois números anteriores, e o formulário de sequência é o seguinte:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946 , …………………
Em matemática, é definido por métodos recursivos:
F_0 = 0
F_1 = 1
F_n = f_ {n-1}+ f_ {n-2}
Implemente o requisito: insira o número de série n e retorne para obter o número Febonacci correspondente
Implementação do Programa 1 - Auto -habitação da função
A cópia do código é a seguinte:
/**
* Função de auto-aladeração
* @Title: fnttype1
* @Description: TODO
* @param @param n
* @param @return
* @return int
* @Throws Exception
*/
public int fntype1 (int n) lança exceção {
if (n == 0) {
retornar 0;
} else if (n == 1 || n == 2) {
retornar 1;
} else if (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
lançar uma nova exceção ("valor inválido para o tipo int, muito grande");
}outro{
retornar temp;
}
}outro{
lançar uma nova exceção ("Valor ilegalarment para n, digite n> = 0");
}
}
Desvantagens deste método: Um grande número de iterações consome continuamente o espaço da pilha (aqueles que se envolvem no desenvolvimento da web, depuração e manutenção devem saber o valor dos recursos da pilha do servidor. Se um grande número de iterações de chamadas simultâneas fizer com que os recursos da pilha do servidor sejam reciclados Por um longo tempo, resultando na falha do servidor da web). ocorrem e a depuração é difícil.
Implementação do programa 2 - Tempo a espaço
A cópia do código é a seguinte:
/**
* Hora de mudar de espaço
* @Title: fnttype2
* @Description: TODO
* @param @param n
* @param @return
* @return int (n <0 return -1, além do max int tamanho retorno -2)
* @THOWS
*/
public int fntype2 (int n) {
int resultado = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= n; index ++) {
if (index == 0) {
resultado = temp1;
} else if (index == 1) {
resultado = temp2;
}outro{
resultado = temp1+temp2;
if (resultado <0) {
resultado = -2;
quebrar;
}
temp1 = temp2;
temp2 = resultado;
}
}
resultado de retorno;
}
Este método é usado principalmente em: Cenário 1: Para cenários em que objetos ou variáveis são usados com menos frequência e não serão usados novamente após o uso uma vez; Este método é frequentemente usado no design;
Implementação do programa 3 - Espaço para o tempo
A cópia do código é a seguinte:
Lista estática privada <TEGER> fNDATA = new ArrayList <Teger> ();
private estático final int maxsize = 50000;
/**
* Inicializador
* @Title: setfndata
* @Description: TODO
* @param
* @return void
* @THOWS
*/
private estático void setfndata () {
int resultado = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= maxSize; index ++) {
if (index == 0) {
resultado = temp1;
} else if (index == 1) {
resultado = temp2;
}outro{
resultado = temp1+temp2;
if (resultado <0) {
resultado = -2;
quebrar;
}
temp1 = temp2;
temp2 = resultado;
}
fndata.add (resultado);
}
}
/**
* Interface externa
* @Title: getfndata
* @Description: TODO
* @param @param n
* @param @return
* @return int <span style = "font-family: sans-serif;"> (n além de fndata.size () e n <0 return -1) </span>
* @THOWS
*/
public int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}outro{
retornar -1;
}
}
Esse método é geralmente usado em cenários em que existem objetos ou variáveis ou são frequentemente chamados durante todo o ciclo de vida do programa, como chamar a interface externa do WebService, camada de persistência de abstração, carregamento de parâmetros de arquivo de configuração comumente usado, etc.
Casos de teste:
A cópia do código é a seguinte:
pacote com.dbc.yangg.swing.test;
importar java.util.arraylist;
importar java.util.list;
/**
* Digite o número da sequência n e retorne para obter o número febonacci correspondente
* @ClassName: init
* @Description: TODO
* @Author [email protected]
* @Date 10 de janeiro de 2014 às 19:52:13
*
*/
classe pública init {
/**
* Função de auto-aladeração
* @Title: fnttype1
* @Description: TODO
* @param @param n
* @param @return
* @return int
* @Throws Exception
*/
public int fntype1 (int n) lança exceção {
if (n == 0) {
retornar 0;
} else if (n == 1 || n == 2) {
retornar 1;
} else if (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
if (temp <0) {
lançar uma nova exceção ("valor inválido para o tipo int, muito grande");
}outro{
retornar temp;
}
}outro{
lançar uma nova exceção ("Valor ilegalarment para n, digite n> = 0");
}
}
/**
* Hora de mudar de espaço
* @Title: fnttype2
* @Description: TODO
* @param @param n
* @param @return
* @return int (n <0 return -1, além do max int tamanho retorno -2)
* @THOWS
*/
public int fntype2 (int n) {
int resultado = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= n; index ++) {
if (index == 0) {
resultado = temp1;
} else if (index == 1) {
resultado = temp2;
}outro{
resultado = temp1+temp2;
if (resultado <0) {
resultado = -2;
quebrar;
}
temp1 = temp2;
temp2 = resultado;
}
}
resultado de retorno;
}
Lista estática privada <TEGER> fNDATA = new ArrayList <Teger> ();
private estático final int maxsize = 50000;
/**
* Espaço para mudar o tempo
* @Title: setfndata
* @Description: TODO
* @param
* @return void
* @THOWS
*/
private estático void setfndata () {
int resultado = -1;
int temp1 = 0;
int temp2 = 1;
for (int index = 0; index <= maxSize; index ++) {
if (index == 0) {
resultado = temp1;
} else if (index == 1) {
resultado = temp2;
}outro{
resultado = temp1+temp2;
if (resultado <0) {
resultado = -2;
quebrar;
}
temp1 = temp2;
temp2 = resultado;
}
fndata.add (resultado);
}
}
/**
*
* @Title: getfndata
* @Description: TODO
* @param @param n
* @param @return
* @return int (n além de fndata.size () e n <0 return -1)
* @THOWS
*/
public int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
}
if (fndata.size ()> n && n> = 0) {
return fndata.get (n);
}outro{
retornar -1;
}
}
/**
*
* @Title: Main
* @Description: TODO
* @param @param argv
* @return void
* @THOWS
*/
public static void main (string [] argv) {
Init init = new init ();
int n = 46;
tentar {
System.out.println ("type1 ="+init.fnttype1 (n));
} catch (Exceção e) {
// TODO BLOCO DE CAPAGEM AUTOMAGEM
System.out.println (e.getMessage ());
}
System.out.println ("type2 ="+init.fnttype2 (n));
System.out.println ("type3 ="+init.getfndata (n));
}
}
Resultado da saída:
A cópia do código é a seguinte:
TIPO1 = 1836311903
TIPO2 = 1836311903
TIPO3 = 1836311903
Ao projetar algoritmos, não siga cegamente os conceitos.
Deixe -me reclamar: eu pessoalmente acredito que o excelente design da estrutura de dados pode simplificar a complexidade do design do algoritmo e melhorar a legibilidade do código, a escalabilidade do programa e a eficiência da execução;
Deixe -me reclamar novamente: três princípios devem ser seguidos ao fazer uma análise de demanda: 1. Análise da perspectiva e maneira de pensar do usuário; Os princípios do desenvolvimento do programa são: melhorar ativamente o próprio gosto e analisar funções da perspectiva de uso do usuário e dos cenários de uso; é e qual situação o usuário está a seguir será chamado, quais exceções podem ser causadas por parâmetros de passagem, que exceções podem ocorrer na implementação da interface e capturar possíveis exceções, saída clara, boa função autismo; Em seguida, você está garantindo a implementação de negócios, deve projetar a interface do usuário como usuário em termos de hábitos de uso do usuário e outros aspectos. É muito interessante, certo?