python - 将递归函数重写为迭代方法
问题描述
你将如何在没有递归的情况下重写这个 python 代码?
def f(n):
if n == 1:
return 2
elif n == 2:
return 1
elif n == 3 or n == 4:
return n
r1 = f(n-1)
r2 = f(n-2)
r3 = f(n-3)
r4 = f(n-4)
return (r1+r2+r3)/r4
解决方案
您可以保留初始条件,然后使用r1, r2, r3, r4
when的值n=5
。然后迭代直到你达到你的n
, 通过旋转值并计算下一个比率
def f_vars(n):
initial_values = [2, 1, 3, 4]
if n <= len(initial_values):
return initial_values[n - 1]
r3, r2, r1, next_n = initial_values
for _ in range(n - 4):
r4, r3, r2, r1 = r3, r2, r1, next_n
next_n = (r1 + r2 + r3) / r4
return next_n
使用数组也可以实现,但性能较低
def f_array(n):
initial_values = [2, 1, 3, 4]
if n <= len(initial_values):
return initial_values[n - 1]
for _ in range(n - 4):
initial_values.append(sum(initial_values[1:]) / initial_values[0])
initial_values.pop(0)
return initial_values[-1]
一些时间信息
n=10_000_000
并且f_vars
需要大约2sec
n=10_000_000
并且f_array
需要大约10sec
n=29
并且f (recursive)
需要大约12sec
推荐阅读
- html - HTML , 选择选项内容对齐
- c++ - QT TCP 套接字连接异常。太多参数无法运行
- excel - 合并 Excel 工作表中的行并显示为逗号分隔
- python - WebDriverException:消息:“chromedriver.exe”可执行文件可能通过 Selenium Python 使用 Google Colaboratory 具有错误权限
- python - 如何在python中按月分组日期
- spring - 在 Thymeleaf(和 spring)中为表单创建一个片段
- c# - @inject HttpClient httpClient 与 Blazor 中的 builder.Services.AddHttpClient
- node.js - 如何访问消息中的表情符号
- ios - 滚动时 UITableView 滞后
- asp.net - Telnet IP 地址 Ip