java 피보나치 수열을 실현하는 3가지 방법
실현 수요: 입력 번호 n은 대응하는 페포나 서수 프로그램으로 되돌아와 1― 함수 자동 교체
/**
*
* @Title: fnType1
* @Description: TODO
* @param @param n
* @param @return
* @return int
* @throws Exception
*/
public int fnType1(int n)throws Exception{
if(n==0){
return 0;
}else if(n==1||n==2){
return 1;
}else if(n>2){
int temp=fnType1(n-1)+fnType1(n-2);
if(temp<0){
throw new Exception("Invalid value for int type, too larage");
}else{
return temp;
}
}else{
throw new Exception("IllegalArgument value for n,please enter n>=0 ");
}
}
이러한 방식의 단점: 대량의 교체가 창고 공간을 끊임없이 소모한다(웹 개발 디버깅과 유지보수를 하는 사람들은 모두 서버 창고 자원의 소중함을 알아야 한다. 만약에 대량의 합병 호출이 교체되어 서버 창고 자원을 회수하지 못하고 웹 서버가 붕괴된다), 효율이 낮고 편지의 자폐성이 비교적 약하다(우수한 인터페이스는 입력과 출력에 발생할 수 있는 오류 정보를 포착하고 명확한 처리 결과를 제공해야 한다).오류가 발생하기 쉽고 디버깅이 어렵기 때문에 실제 응용에서 이런 방식을 사용하는 것을 권장하지 않으며 사용 시 교체 횟수도 3회를 초과해서는 안 된다.프로그램 실현 2 - 시간 교환 공간
/**
*
* @Title: fnType2
* @Description: TODO
* @param @param n
* @param @return
* @return int (n<0 return -1,beyond max int size return -2)
* @throws
*/
public int fnType2(int n){
int result=-1;
int temp1=0;
int temp2=1;
for(int index=0;index<=n;index++){
if(index==0){
result=temp1;
}else if(index==1){
result=temp2;
}else{
result=temp1+temp2;
if(result<0){
result=-2;
break;
}
temp1=temp2;
temp2=result;
}
}
return result;
}
이 방법은 주로 장면 1: 대상이나 변수에 대한 사용 횟수가 비교적 적고 한 번 사용한 후에 다시 사용하지 않는 장면에 사용된다.사용 장면2: 메모리 자원이 비교적 희소한 실시간 요구가 높지 않은 삽입식 시스템 설계에서 이런 방식을 많이 사용한다.프로그램 실현 3 – 공간 교환 시간
private static List<Integer> fnData=new ArrayList<Integer>();
private static final int maxSize=50000;
/**
*
* @Title: setFnData
* @Description: TODO
* @param
* @return void
* @throws
*/
private static void setFnData(){
int result=-1;
int temp1=0;
int temp2=1;
for(int index=0;index<=maxSize;index++){
if(index==0){
result=temp1;
}else if(index==1){
result=temp2;
}else{
result=temp1+temp2;
if(result<0){
result=-2;
break;
}
temp1=temp2;
temp2=result;
}
fnData.add(result);
}
}
/**
*
* @Title: getFnData
* @Description: TODO
* @param @param n
* @param @return
* @return int <span style="font-family: sans-serif;">(n beyond fnData.size() and n<0 return -1)</span>
* @throws
*/
public int getFnData(int n){
if(fnData.size()==0){
setFnData();
}
if(fnData.size()>n&&n>=0){
return fnData.get(n);
}else{
return -1;
}
}
이 방법은 일반적으로 프로그램이 실행되는 전체 생명 주기에 대상이나 변수가 존재하거나 빈번하게 호출되는 장면에 사용된다. 예를 들어 외부 웹 서비스 인터페이스 호출, 추상적인 지속화 층, 자주 사용하는 프로필 파라미터 불러오기 등 테스트 용례:
package com.dbc.yangg.swing.test;
import java.util.ArrayList;
import java.util.List;
/**
* n
* @ClassName: Init
* @Description: TODO
* @author [email protected]
* @date 2014 1 10 7:52:13
*
*/
public class Init {
/**
*
* @Title: fnType1
* @Description: TODO
* @param @param n
* @param @return
* @return int
* @throws Exception
*/
public int fnType1(int n)throws Exception{
if(n==0){
return 0;
}else if(n==1||n==2){
return 1;
}else if(n>2){
int temp=fnType1(n-1)+fnType1(n-2);
if(temp<0){
throw new Exception("Invalid value for int type, too larage");
}else{
return temp;
}
}else{
throw new Exception("IllegalArgument value for n,please enter n>=0 ");
}
}
/**
*
* @Title: fnType2
* @Description: TODO
* @param @param n
* @param @return
* @return int (n<0 return -1,beyond max int size return -2)
* @throws
*/
public int fnType2(int n){
int result=-1;
int temp1=0;
int temp2=1;
for(int index=0;index<=n;index++){
if(index==0){
result=temp1;
}else if(index==1){
result=temp2;
}else{
result=temp1+temp2;
if(result<0){
result=-2;
break;
}
temp1=temp2;
temp2=result;
}
}
return result;
}
private static List<Integer> fnData=new ArrayList<Integer>();
private static final int maxSize=50000;
/**
*
* @Title: setFnData
* @Description: TODO
* @param
* @return void
* @throws
*/
private static void setFnData(){
int result=-1;
int temp1=0;
int temp2=1;
for(int index=0;index<=maxSize;index++){
if(index==0){
result=temp1;
}else if(index==1){
result=temp2;
}else{
result=temp1+temp2;
if(result<0){
result=-2;
break;
}
temp1=temp2;
temp2=result;
}
fnData.add(result);
}
}
/**
*
* @Title: getFnData
* @Description: TODO
* @param @param n
* @param @return
* @return int (n beyond fnData.size() and n<0 return -1)
* @throws
*/
public int getFnData(int n){
if(fnData.size()==0){
setFnData();
}
if(fnData.size()>n&&n>=0){
return fnData.get(n);
}else{
return -1;
}
}
/**
*
* @Title: main
* @Description: TODO
* @param @param argv
* @return void
* @throws
*/
public static void main(String[] argv){
Init init=new Init();
int n=46;
try {
System.out.println("Type1="+init.fnType1(n));
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
System.out.println("Type2="+init.fnType2(n));
System.out.println("Type3="+init.getFnData(n));
}
}
출력 결과:
Type1=1836311903
Type2=1836311903
Type3=1836311903
알고리즘 디자인에 대해 맹목적으로 개념을 따르지 마라. 개념은 죽고 사람은 산다(이 시대에crazyman이 필요한 시대에 규칙을 따르는 것보다 아이디어가 우세하다). 구체적인 응용 장면을 결합해야만 우수한 알고리즘과 구조를 설계할 수 있다.개인적으로 우수한 데이터 구조 디자인은 알고리즘 디자인의 복잡도를 간소화하고 코드의 가독성, 프로그램의 확장성과 집행 효율을 높일 수 있다고 생각한다.다시 한 번 말씀드리지만 수요 분석을 할 때 세 가지 원칙을 따라야 합니다. 1.사용자의 각도와 사고방식 분석;2. 사용자가 말한 것이 반드시 그들이 진정으로 원하는 것은 아니다.3. 사용자의 말이 꼭 맞는 것은 아니다.프로그램 개발은 원칙에 따른다. 자신의 품위를 적극적으로 향상시키고 사용자의 사용 각도에 서서 장면 분석 기능을 사용한다.예를 들어 백엔드 인터페이스 개발을 하면 당신의 사용자는 인터페이스 호출자입니다. 인터페이스 기능이 무엇인지, 사용자가 어떤 상황에서 호출될지, 파라미터를 전송하면 어떤 이상을 초래할 수 있는지, 당신의 인터페이스 실현 과정에서 어떤 이상이 나타날 수 있는지, 그리고 발생할 수 있는 이상을 포획하여 명확한 출력, 좋은 함수 자폐성을 고려해야 합니다.만약 당신이 프론트 데스크톱을 한다면 업무 실현을 확보하는 토대에서 사용자의 사용 습관 등 측면에서 자신을 사용자로 삼아 UI를 설계해야 한다.재미있죠? 수요, 개발이 많으면 자연히 O(____)O~를 알 수 있어요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
메모화를 배운최근 Web계 기업의 인턴 전형이나 본 전형을 받을 기회가 몇번이나 있었습니다. 많은 기업의 전형에서 코딩 테스트가 있었고, 이번 조금 공부했기 때문에 아웃풋 연습도 겸해 비망록적인 느낌으로 남겨 둡니다. 이번은 메...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.