2、杨辉三角
其数据如图5-3所示,杨辉三角第n行的数字有n项,每行数字左右对称,由1开始逐渐变大,每个数等于它上方两数之和。试用递归函数方法打印出n行的杨辉三角图形。
n=1 n=2 n=3 n=4 n=5 n=6 n=7
- 代码:
def y(n, k):
if k == 0 or k == n:
return 1
return y(n - 1, k - 1) + y(n - 1, k)
def triangle(n):
for i in range(n):
for j in range(i + 1):
print(y(i, j), end=" ")
print()
n = 7
triangle(n)
- 结果:
- 分析:
定义个y储存行列,
if k == 0 or k == n:
return 1
使每一行的第一个和最后一个为1
return y(n - 1, k - 1) + y(n - 1, k)
计算上一行两数和
def triangle(n):
for i in range(n):
for j in range(i + 1):
print(y(i, j), end=" ")
print()
第一个for控制行,嵌套for循环控制列,end=””,为空格,print()为换行
递归
代码:
def y(n, k):
if k == 0 or k == n:
return 1
return y(n - 1, k - 1) + y(n - 1, k)
def triangle(n):
for i in range(n):
for j in range(i + 1):
print(y(i, j), end=" ")
print()
n = 10
triangle(n)
2.截图:
3.分析:
代码中的y(n, k)函数用于计算杨辉三角中第n行第k个位置的值,而triangle(n)函数则用于打印出前n行的杨辉三角。递归的基础情况是当k为0或k等于n时,返回1。对于其他情况,函数返回y(n - 1, k - 1)和y(n - 1, k)的和,即上一行相邻两个位置的值之和。外层循环i用于控制行数,内层循环j用于控制每行的列数。内层循环中,调用y(i, j)函数来计算并打印当前位置的值,然后用end=" "来确保每个值后面都有一个空格。当内层循环结束后,使用print()函数来确保每行结束后有一个换行。
5.装饰器
1.代码:
import time
def decorator(func):
def wrapper(*args,**kwargs):
start_time=time.time()
re=func(*args,**kwargs)
end_time=time.time()
timer=end_time-start_time
print("run time spend:",timer,'s',sep="")
return re
return wrapper
@decorator
def run_func(a,b):
time.sleep(0.1)
return a**b
a=int(input("input x: ").strip(''))
b=int(input("input y: ").strip(''))
print("%d**%d=%d"%(a,b,run_func(a,b)))
2.截图:
3.分析:
首先引入time库
位置参数*args和关键字参数**kwargs,调用原函数func,并将*args和**kwargs传递给它。
装饰器 decorator 接受一个函数 func 作为参数,并返回一个新的函数 wrapper。
@decorator 是一个装饰器的语法糖,它等价于 run_func = decorator(run_func)。run_func 函数实际上被替换为 wrapper 函数(在装饰器内部定义)。当你调用 run_func(a, b) 时,你实际上是在调用 wrapper(a, b)。