파이썬 기본적인 프로그래밍 : 자세한 파이썬 재귀, 꼬리 재귀, 순환 세 가지 방법으로 피보나치 수

이 문서에서는 재귀를 사용하여 파이썬, 꼬리 재귀, 사이클 세 가지 방법으로 피보나치 열, 아주 실용적 가치를 설명 할 필요 친구를 참조 할 수 있습니다
피보나치 코드의 모든 매우 시작이다 재귀 적으로 많은 단점, 낮은 효율, 자원의 낭비가 재귀 작성하고, 스택 오버 플로우를 일으킬 수 있으며, 재귀 프로그램의 장점은 매우 분명하다 수준의 구조를 이해하기 쉽게, 매우 분명하다이다

당신은 꼬리 재귀 방식을 사용하는 것도 물론, 재귀 루프 방식을 대체 할 수 사용할 수있다.
각 재귀위한 대응 결과, 함수 호출은 호출 함수의 끝에 나타납니다 경우에도 일단 꼬리 재귀은 (는) 꼬리 때문에, 그래서 직접 호출 로컬 변수를 보유 할 필요가 없다, 마지막으로 처음부터 계산된다 발신자를 건너 함수가 반환 호출자 갈 호출자에게 반환됩니다. 테일 재귀 계산 결과는 다수의 상기 파라미터들 때문에, 직면 더 간단한 문제 깊은 기능하지만 더 복잡한 문제는 하위 계층으로 전달 함수의 매개 변수의 현재 (또는 경로)되지이고 경로 계산 단계. 꼬리 재귀가 매우 중요하지 꼬리 재귀입니다, 스택 소비 기능이 헤아릴 수없는, 우리는 중간 기능의 스택을 많이 저장해야합니다. 필요 전에 직접 재귀 절차는 매우 자원 집약적 모든 N 단계 작업의 상태를 저장하고, 꼬리 재귀를 필요로하지 않습니다, 그것은 꼬리 재귀 프로그래밍 기술이다. 재귀 함수 경우, 재귀 호출에 의해 반환 된 결과는 직접, 그것은 꼬리 재귀 호출되는 총 수익입니다. 꼬리 재귀 함수는 알고리즘이 관점에서 함수형 프로그래밍 언어와 컴파일러로 변환하는 데 도움이뿐만 아니라 쉽게 최적화 할 수있는 일반적인 사이클이된다. 컴퓨터에서 기본은 모든 사이클을 달성하기 위해 점프 시프트 코드의 사용의 시작 부분에 반복되기 때문입니다. 꼬리 반품이있는 경우 매개 변수의 컴퓨터는 다시 통화 시간의 기능을 변경해야하기 때문에, 당신은 단지, 중첩 된 스택을 필요로
예 피보나치 수를 달성하기 위해 여기에 꼬리 재귀, 재귀 및 대비주기를 심화하기 위해 :

#!usr/bin/env python  
#encoding:utf-8    
''''''' 
__Author__:沂水寒城 
功能:尾递归 
'''   
import time 
def Fib_recursion(num): 
  ''''' 
  直接使用递归法求解斐波那契数量的第num个数字 
  ''' 
  if num<2: 
   return num  
  return Fib_recursion(num-1)+Fib_recursion(num-2) 
  
def Fib_tail_recursion(num,res,temp): 
  ''''' 
  使用尾递归法求解斐波那契数量的第num个数字 
  ''' 
  if num==0: 
    return res  
  else: 
    return Fib_tail_recursion(num-1, temp, res+temp)  
def Fib_circle(num): 
  ''''' 
  直接使用循环来求解 
  ''' 
  a=0
  b=1
  for i in range(1,num): 
    c=a+b 
    a=b 
    b=c  
  return c  
   
if __name__ == '__main__': 
  num_list=[5,10,20,30,40,50] 
  for num in num_list: 
    start_time=time.time() 
    print Fib_recursion(num) 
    end_time=time.time() 
    print Fib_tail_recursion(num,0,1) 
    end_time2=time.time() 
    print Fib_circle(num) 
    end_time3=time.time() 
    print '正在求解的斐波那契数字下标为%s' %num 
    print '直接递归耗时为 :', end_time-start_time 
    print '尾递归调用耗时为:', end_time2-end_time 
    print '直接使用循环耗时为:', end_time3-end_time2 

결과는 다음과 같다 :

5 
5 
5 
正在求解的斐波那契数字下标为5 
直接递归耗时为 : 6.38961791992e-05 
尾递归调用耗时为: 2.31266021729e-05 
直接使用循环耗时为: 1.97887420654e-05 
55 
55 
55 
正在求解的斐波那契数字下标为10 
直接递归耗时为 : 6.60419464111e-05 
尾递归调用耗时为: 3.31401824951e-05 
直接使用循环耗时为: 1.8835067749e-05 
6765 
6765 
6765 
正在求解的斐波那契数字下标为20 
直接递归耗时为 : 0.00564002990723 
尾递归调用耗时为: 3.09944152832e-05 
直接使用循环耗时为: 2.09808349609e-05 
832040 
832040 
832040 
正在求解的斐波那契数字下标为30 
直接递归耗时为 : 0.39971113205 
尾递归调用耗时为: 1.69277191162e-05 
直接使用循环耗时为: 1.19209289551e-05 
102334155 
102334155 
102334155 
正在求解的斐波那契数字下标为40 
直接递归耗时为 : 39.0365440845 
尾递归调用耗时为: 2.19345092773e-05 
直接使用循环耗时为: 1.78813934326e-05 
12586269025 
12586269025 
12586269025 
正在求解的斐波那契数字下标为50 
直接递归耗时为 : 4915.68643498 
尾递归调用耗时为: 2.19345092773e-05 
直接使用循环耗时为: 2.09808349609e-05 

더 명확하게 차이를 볼 수있는 차트를 페인트 : 그림 삽입 설명 여기
격차가 너무 크기 때문에, 두 가지 방법으로 결과하는 것은 꼬리 재귀 루프의 시간을 증가 거의 수평, 거의 90도를 직접 재귀 시간이 증가 할 수 있습니다.

이 시간, 느낌 좋은 환자는, 그것은 분명하다, 당신은 세 시간 대비의 상태를 볼 수있는 프로그램의 결과를 기다리고 거기있다 : 시간의 직접 재귀의 빠른 성장, 그리고 성능이 재활용보다 훨씬 낫다 꼬리 재귀이 재귀 대신 루프를 사용하여, 재귀의 사용을 최소화 확실히 향상시킬 수있는 효율적인 방법을 실행하는 방법이다라고 우리에게 이야기한다.
마지막으로, 나는 좋은 평판 파이썬 모임을 추천 [ 입력합니다 고참, 기술을 학습 경험, 면접 스킬, 직장 경험과 다른 공유 학습이 많이있다,], 더 많은 우리는주의 깊게 실제 프로젝트 데이터에 제로 소개 정보를 준비 방법, 매일, 프로그래머는 학습과 작은 세부 사항에 관심을 지불 할 필요의 일부를 공유하고, 타이밍 파이썬 기술을 설명

게시 25 개 원래 기사 · 원 찬양 7 ·은 30000 +를 볼

추천

출처blog.csdn.net/haoxun11/article/details/104954471