递归
- 函数调用自身,这个函数就是递归函数
- 递归经验:
- 找边界——要有结束条件
- 找变化——可变参数
- 找重复——子问题
题目
计算正整数的阶乘
用递归方法一:
def f(n):
if n == 1:
return 1
return f(n-1)*n
x = int(input())
print(f(x))
用递归方法二
def f(n):
global s
if n==1:
return
s *= n
return f(n-1)
n = int(input())
s = 1
f(n)
print(s)
用循环
x = int(input())
ans = 1
for i in range(1,n+1):
ans *= i
print(ans)
用内置函数
import math
x = int(input())
print(math.factorial(n))
打印杨辉三角
用递归:
def f(i,j):
if j==0 or i==j:
return 1
return f(i-1,j) + f(i-1,j-1)
for i in range(7):
for k in range(7-i):
print(' ',end='')
for j in range(i+1):
print(f(i,j),end=' ')
print()
用循环:
a = [[0]*(i+2) for i in range(7)]
# i+2是多一列,为最后一个1计算出来作准备
for i in range(7):
for k in range(7-i):
print(' ',end='')
for j in range(i+1):
if j == 0:
a[i][j]=1
else:
a[i][j] = a[i-1][j-1]+a[i-1][j]
print(a[i][j], end=' ')
print()
切香肠问题
题目链接
代码如下
def cut(n, k):
if n == 0:
return 0
if n >= k:
return cut(n % k, k)
return cut(n, k - n) + n
a, b = map(int, input().split())
print(cut(a, b))
放苹果问题
def f(m,n):
if m<n:
return 0
elif m==n:
return 1
else:
s = 0
for j in range(1,n+1):
s+=f(m-n,j)
return s
while 1:
try:
m,n = map(int,input().split())
ans = 0
for i in range(1,n+1):
ans += f(m,i)
print(ans)
except:
break
方法二
def ways(m, n):
if m == 0 or n == 1:
return 1
elif n == 0:
return 0
elif m < n:
return ways(m, m)
else:
return ways(m - n, n) + ways(m, n - 1)
while 1:
try:
m, n = map(int,input().split())
except:
break
ans = ways(m, n)
print(ans)
进一步优化代码如下
def ways(m,n):
if m<0:
return 0
elif m==0 or n == 1:
return 1
return ways(m,n-1)+ways(m-n,n)
while 1:
try:
m,n = map(int,input().split())
print(ways(m,n))
except:
break