一个只考虑串、并联方式的Python代码参考:
+ 表示串,| 表示并
def _getR(key:list, result:dict) -> list:
'''获得方案,key:搭配模式,result:原方案'''
re = []
# 把所有可能的组合遍历一遍
for mode_x in result[key[0]]:
for mode_y in result[key[1]]:
# 串接
tmp = f'({mode_x[0]})+({mode_y[0]})'
tmp = tmp.replace('(R)', 'R')
re.append((tmp, mode_x[1] + mode_y[1]))
# 并接
tmp = f'({mode_x[0]})|({mode_y[0]})'
tmp = tmp.replace('(R)', 'R')
re.append((tmp, mode_x[1] * mode_y[1] / (mode_x[1] + mode_y[1])))
return re
def getR(n:int) -> list:
'''获得方案,n:总个数'''
result = {
1:[('R', 1000.0),],
2:[('R+R', 2000.0), ('R|R', 500.0)]
}
if n < 3:
# 1、2时直接返回
return result[n]
else:
# 3以上需要把自1-n的全部获取到
for i in range(3, n+1):
re = []
# 遍历所以拆分方式,如5拆为1+4,2+3 6拆为1+5,2+4,3+3
for j in range(1, i // 2 + 1):
re += _getR([j, i-j], result)
result[i] = re
return result[n]
if __name__ == '__main__':
# 5个电阻方案
s = getR(5)
print()
tmp = []
redu = []
for _s in s:
# 因小数除不尽问题,保留6位小数
if '{:.6f}'.format(_s[1]) in tmp:
# 存在相同数值的方案视为同一方案,需删除
redu.append(_s)
else:
tmp.append('{:.6f}'.format(_s[1]))
# 删除数值重复方案
for r in redu:
s.remove(r)
# 打印个数,方案
print(len(s), s)
5 个的结果是:
22
[('R+(R+(R+(R+R)))', 5000.0), ('R|(R+(R+(R+R)))', 800.0), ('R+(R|(R+(R+R)))', 1750.0), ('R|(R|(R+(R+R)))', 428.57142857142856), ('R+(R+(R|(R+R)))', 2666.6666666666665), ('R|(R+(R|(R+R)))', 625.0), ('R+(R|(R|(R+R)))', 1400.0), ('R|(R|(R|(R+R)))', 285.7142857142857), ('R+(R+(R+(R|R)))', 3500.0), ('R|(R+(R+(R|R)))', 714.2857142857143), ('R+(R|(R+(R|R)))', 1600.0), ('R|(R|(R+(R|R)))', 375.0), ('R+(R+(R|(R|R)))', 2333.333333333333), ('R|(R+(R|(R|R)))', 571.4285714285714), ('R+(R|(R|(R|R)))', 1250.0), ('R|(R|(R|(R|R)))', 200.0), ('R+((R+R)|(R+R))', 2000.0), ('R|((R+R)|(R+R))', 500.0), ('(R+R)|(R+(R+R))', 1200.0), ('(R+R)|(R+(R|R))', 857.1428571428571), ('(R|R)+(R|(R+R))', 1166.6666666666665), ('(R|R)+(R|(R|R))', 833.3333333333333)]