斐波那契 尾遞迴

2022-06-30 11:21:11 字數 3003 閱讀 5766

# (1)計算任意數n的階乘

# 5! 5*4*3*2*1

# 8! 8*7*6*5*4*3*2*1

'''遞迴函式通過兩個條件出發回的過程:

(1) 當前函式徹底執行完畢的時候,觸發回的過程,回到上一層函式的呼叫處

(2) 當前函式遇到return 返回值的時,觸發回的過程,回到上一層函式的呼叫處

'''# 普通方法

n = 5

total = 1

for i in range(1,n+1):

total *= i

print(total)

# 5*4*3*2*1

def jiecheng(n):

if n<=1 :

return 1

return n * jiecheng(n-1)

# jiecheng(1) => 1

res = jiecheng(5)

print(res)

'''# **解析:

去的過程:

n = 5 return 5 * jiecheng(5-1) => 5 * jiecheng(4)

n = 4 return 4 * jiecheng(4-1) => 4 * jiecheng(3)

n = 3 return 3 * jiecheng(3-1) => 3 * jiechneg(2)

n = 2 return 2 * jiecheng(2-1) => 2 * jiecheng(1)

n = 1 return 1

回的過程:

n = 2 return 2 * jiecheng(2-1) => 2 * 1

n = 3 return 3 * jiecheng(3-1) => 3 * 2 * 1

n = 4 return 4 * jiecheng(4-1) => 4 * 3 * 2 * 1

n = 5 return 5 * jiecheng(5-1) => 5 * 4 * 3 * 2 * 1

res = 5 * 4 * 3 * 2 * 1 =120

'''# (2)尾遞迴: 只返回遞迴函式本身且非表示式(沒有運算(+-*/..))

'''只開闢乙個棧幀空間完成遞迴函式(因為最終的返回值就是第一層空間的返回值,所以只需要一層棧幀空間即可,不停的進行替換)

cpython直譯器不支援.可以換乙個支援尾遞迴的直譯器(比如在公司內部大型伺服器架構的直譯器 推薦使用)

'''# 方法一

def jiecheng2(n,endval=1):

if n<=1 :

return endval

return jiecheng2(n-1,n*endval)

res = jiecheng2(5,1)

print(res)

'''# 去的過程

n=5 endval = 1

return jiecheng(5-1,5*1) => jiecheng(4,5*1)

n=4 endval = 5*1

return jiecheng(4-1,4 *5*1) => jiecheng(3,4*5*1)

n=3 endval = 4*5*1

return jiecheng(3-1,3* 4*5*1) => jiecheng(2, 3*4*5*1)

n=2 endval = 3*4*5*1

return jiecheng(2-1,2* 3*4*5*1) => jiecheng(1, 2*3*4*5*1)

n=1 endval = 2*3*4*5*1

n<=1 這個條件滿足了 直接返回endval

# 回的過程

n=2 endval = 3*4*5*1

return jiecheng(2-1,2* 3*4*5*1) => 2*3*4*5*1

n=3 endval = 4*5*1

return jiecheng(3-1,3* 4*5*1) => 2*3*4*5*1

n=4 endval = 5*1

return jiecheng(4-1,4 *5*1) => 2*3*4*5*1

n=5 endval = 1

return jiecheng(5-1,5*1) => 2*3*4*5*1

如果執行到最後一層函式,有返回值了,那麼這個返回值就是最終的值,

所有尾遞迴只需要一層棧幀空間.

'''# 方法二 優化版

# 系統底層用

def jiecheng2(n,endval):

if n<=1 :

return endval

return jiecheng2(n-1,n*endval)

# 給使用者用 不需要使用者填寫第二個引數(比較人性化)

def jiecheng3(n):

return jiecheng2(n,1)

res = jiecheng3(5)

print(res)

# (3)斐波那契數列

# 1,1,2,3,5,8,13,21,34,55

# 第n個數 它的數值是多少?

# 除了前2個 ,後面每乙個值都是上乙個數 + 上上的數 兩者之和

def fib(n):

if n ==1 or n==2:

return 1

return fib(n-1) + fib(n-2)

res = fib(5)

print(res)

'''**解析:

n = 5

=> return fib(5-1) + fib(5-2)

=> return fib(4) + fib(3) => 3 + 2 => 5

fib(4) => 3

fib(3) + fib(2)

fib(2)+fib(1)=1+1=2 + 1

2+1 = 3

fib(3) =>2

fib(2) + fib(1)

1 + 1 = 2

'''

斐波那契 尾遞迴,DP

先看斐波拉契遞迴的樸素版本 int fib1 int n 這段 的意思是 第n個數等於前兩個數之和。但 f 1 1,f 0 0,這兩個特殊值作為遞迴出口。優化 尾遞迴 int fib wei int n int a,int b intmain 這段 明顯可讀性比樸素版本低,但優點在於將時間複雜度從o...

斐波那契數列求解 尾遞迴

1.普通遞迴 這裡觀察f 4 的遞迴樹代替f 10 的遞迴樹 後者比較大,畫不下 使用遞迴求解的時候複雜度為t n t n 1 t n 2 t n t n 1 t n 2 t n t n 1 t n 2 觀察遞迴樹,發現降速最快的是最右邊每次減2,因此n 2 frac 2n 層以上的部分肯定是滿二叉...

遞迴 斐波那契

題 若一頭小母牛,從出生起第四個年頭開始每年生一頭母牛,按此規律,第n年有多少頭母牛?具體分析 1 分析題目 從出生起第四個年頭開始每年生一頭母牛 時間 年 未成熟母牛 頭 成熟母牛 頭 母牛總數 頭 1 1 0 1 2 1 0 1 3 1 0 1 4 0 1 1 5 1 1 2 6 2 1 3 7...