1. 兔子繁殖问题

兔子从出生后第3个月起每个月都会生一对兔子,小兔子成长到第三个月后每个月又会生一对兔子。初始有一对小兔子,假如兔子都不死,用户输入一个月份数,计算并在一行内输出从1到n月每个月的兔子数量。

图 3.3 兔子繁殖规律.png
图 3.3 兔子繁殖规律

各月的兔子数量形成的数列是:
1,1,2,3,5,8,13,……
斐波那契数列以如下被以递推的方法定义:
F(1)=1
F(2)=1
F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
计算a,b指向数据的和作为新的一项,同时将变量b指向新产生的数据项,将变量a指向倒数第二项,也就是原来变量b指向的那个数据,这个操作可以用同步赋值语句a,b=b,a+b实现。
3.4 变量同步赋值.png
图 3.4 变量同步赋值

  1. n = int(input()) # int()将input()接收的字符串转整数,例如输入12
  2. a, b = 1, 1 # 设定数列前两项的初值
  3. for i in range(n): # i 只用于控制循环次数,n值为12
  4. print(a, end=' ') # 每次循环输出一个值,不换行
  5. a, b = b, a + b # b的值赋给a,把a,b的和赋值给b
  6. # 1 1 2 3 5 8 13 21 34 55 89 144

2. 迭代法开平方

  1. import math
  2. x = int(input()) # 输入整数
  3. x1 = x / 2 # 初值
  4. x2 = (x1 + x / x1) / 2 # 迭代公式
  5. while abs(x1 - x2) > 1e-5: # 迭代精度
  6. x1 = x2
  7. x2 = (x1 + x / x1) / 2
  8. print(x2) # 2.23606797749979
  9. print(math.sqrt(x)) # 2.23606797749979

3. 牛顿迭代法

牛顿迭代法解 一元三次方程 x³-2x+1=0,给定误差 0.0001

  1. def f(x):
  2. """f的方程"""
  3. return x ** 3 - 2 * x + 1
  4. def f_first_order(x):
  5. """f的一阶导数"""
  6. return 3 * x ** 2 - 2
  7. def get_root(x0, max_iter=50, tol=1e-5):
  8. """将初始值浮点化"""
  9. p0 = x0
  10. for i in range(max_iter):
  11. p = p0 - f(p0) / f_first_order(p0) # f的一阶导数不能为0
  12. if abs(p - p0) < tol: # 如果小于精度值则退出迭代
  13. return f'经{i}次迭代,估计参数值是{p:.3f}'
  14. p0 = p
  15. print('达到最大迭代次数,无法收敛')
  16. if __name__ == '__main__':
  17. print(get_root(2)) # 经6次迭代,估计参数值是1.000
  18. print(get_root(0)) # 经4次迭代,估计参数值是0.618
  19. print(get_root(-2)) # 经4次迭代,估计参数值是-1.618