如何遍历多参数组合调用euler函数寻找五次方等式匹配解?
问题与解决方案
问题描述
现有如下Python函数:
def euler(a,b,c,d): my_dict = {'A1':[],'A2':[],'A3':[],'A4':[],'Number': []} y = a**5 + b**5 + c**5 + d**5 for n in range(140,161): if n**5 == y: my_dict['A1'].append(a) my_dict['A2'].append(b) my_dict['A3'].append(c) my_dict['A4'].append(d) my_dict["Number"].append(n) return my_dict else: pass
该函数接收参数a、b、c、d,计算y = a⁵ + b⁵ + c⁵ + d⁵,判断是否存在n∈[140,160]使得n⁵ = y,若存在则返回记录参数与n的字典。
需求:遍历a(20至40)、b(80至100)、c(100至120)、d(120至140)的所有参数组合,调用该函数找到符合条件的匹配。
实现方案
方法1:嵌套for循环
直接通过四层嵌套循环遍历所有参数组合,调用euler函数并收集结果:
# 保留原euler函数 def euler(a,b,c,d): my_dict = {'A1':[],'A2':[],'A3':[],'A4':[],'Number': []} y = a**5 + b**5 + c**5 + d**5 for n in range(140,161): if n**5 == y: my_dict['A1'].append(a) my_dict['A2'].append(b) my_dict['A3'].append(c) my_dict['A4'].append(d) my_dict["Number"].append(n) return my_dict else: pass # 遍历所有参数组合 result = None for a in range(20, 41): for b in range(80, 101): for c in range(100, 121): for d in range(120, 141): current = euler(a, b, c, d) if current is not None: result = current # 找到结果后提前终止所有循环 break if result is not None: break if result is not None: break if result is not None: break # 输出结果 if result: print("找到匹配:") print(result) else: print("未找到符合条件的匹配")
方法2:使用itertools.product简化循环
借助itertools.product生成所有参数组合,避免多层嵌套,代码更简洁:
import itertools # 保留原euler函数 def euler(a,b,c,d): my_dict = {'A1':[],'A2':[],'A3':[],'A4':[],'Number': []} y = a**5 + b**5 + c**5 + d**5 for n in range(140,161): if n**5 == y: my_dict['A1'].append(a) my_dict['A2'].append(b) my_dict['A3'].append(c) my_dict['A4'].append(d) my_dict["Number"].append(n) return my_dict else: pass # 生成所有参数组合 params = itertools.product( range(20, 41), range(80, 101), range(100, 121), range(120, 141) ) # 遍历组合并查找结果 result = None for a, b, c, d in params: current = euler(a, b, c, d) if current is not None: result = current break # 输出结果 if result: print("找到匹配:") print(result) else: print("未找到符合条件的匹配")
函数优化建议
原euler函数循环遍历n的方式效率较低,由于5次方是严格单调递增的,可直接计算y的5次方根,判断是否为整数且在[140,160]范围内,优化后的函数如下:
def euler_optimized(a,b,c,d): my_dict = {'A1':[],'A2':[],'A3':[],'A4':[],'Number': []} y = a**5 + b**5 + c**5 + d**5 # 计算5次方根并取整,验证是否符合条件 n = round(y ** (1/5)) if 140 <= n <= 160 and n**5 == y: my_dict['A1'].append(a) my_dict['A2'].append(b) my_dict['A3'].append(c) my_dict['A4'].append(d) my_dict["Number"].append(n) return my_dict return None
使用优化后的函数可减少循环次数,提升整体运行效率。
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

