# (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...