gpt4 book ai didi

python - 将for循环和if语句的递归函数变成迭代函数

转载 作者:行者123 更新时间:2023-11-28 20:50:53 25 4
gpt4 key购买 nike

挑战是找到所有小于 N 且总和等于 N 的数字的可能组合。例如,当 N 等于:

  • 2
    • 1+1 - 1 路
  • 3
    • 2+1
    • 1+1+1 - 2 种方式
  • 4
    • 3+1
    • 2+2
    • 2+1+1
    • 1+1+1+1 - 4 种方式

等等……

现在用 python 创建它,为了理解我第一次起草这段代码的模式:

N=5
for d in drange(0,N,1):
if N-d*4>=0:
for c in drange(0,N,1):
if N-d*4-c*3>=0:
for b in drange(0,N,1):
if N-d*4-c*3-b*2>=0:
for a in drange(0,N,1):
if N-d*4-c*3-b*2-a*1==0:
if sum([d,c,b,a])!=1:
print d,c,b,a
else: break
else:break
else:break
  1. 然后我将代码更改为适用于 N = 6 及以下的代码:
N=6
for e in drange(0,N,1):
if N-e*5>=0:
C0 = N-e*5
for d in drange(0,N,1):
if C0-d*4>=0:
C1 = C0-d*4
for c in drange(0,N,1):
if C1-c*3>=0:
C2 = C1-c*3
for b in drange(0,N,1):
if C2-b*2>=0:
C3 = C2-b*2
for a in drange(0,N,1):
if C3-a*1==0:
if sum([e,d,c,b,a])!=1:
print e,d,c,b,a
else: break
else:break
else:break
else:break
  1. 下一个版本合并了数组以跟踪数字并节省计算空间:
N=6
Nums = drange2(6-1,-1,-1)
Vals = [0]*6
Vars = [0]*6
for Vars[0] in drange(0,N,1):
if N-Vars[0]*Nums[0]>=0:
Vals[0] = N-Vars[0]*Nums[0]
for Vars[1] in drange(0,N,1):
if Vals[0]-Vars[1]*Nums[1]>=0:
Vals[1] = Vals[0]-Vars[1]*Nums[1]
for Vars[2] in drange(0,N,1):
if Vals[1]-Vars[2]*Nums[2]>=0:
Vals[2] = Vals[1]-Vars[2]*Nums[2]
for Vars[3] in drange(0,N,1):
if Vals[2]-Vars[3]*Nums[3]>=0:
Vals[3] = Vals[2]-Vars[3]*Nums[3]
for Vars[4] in drange(0,N,1):
if Vals[3]-Vars[4]*Nums[4]==0:
if sum([Vars[0],Vars[1],Vars[2],Vars[3],Vars[4]])!=1:
print Vars
else: break
else:break
else:break
else:break
  1. 然后我想使这段代码在 N 为 100 时起作用,我让它递归...
N=48
Nums = drange2(N-1,-1,-1)
Vals = [0]*N
Vars = [0]*(N-1)
count=0
def sumCombos(Number,i):
if i==0:
global count
for Vars[i] in xrange(0,i+2,1):
z = Number-Vars[i]*Nums[i]
if z>=0:
Vals[i] = z
sumCombos(Number,i+1)
else: break
elif i<Number-2:
for Vars[i] in xrange(0,i+1,1):
z = Vals[i-1]-Vars[i]*Nums[i]
if z >=0:
Vals[i]=z
sumCombos(Number,i+1)
else: break
elif i==Number-2:
for Vars[i] in xrange(0,i+3,1):
if Vals[i-1]-Vars[i]*Nums[i]==0:
count+=1
sumCombos(N,0)
print count
  1. 问题:由于调用了 1000000 多次方法,这需要太多时间,所以有没有一种方法可以让我在不输入所有内容的情况下创建之前的级联效果来进行迭代?我在网站和其他网站上搜索了如何制作涉及 for 循环和 if 语句迭代的递归函数,但没有找到这个特定的运气。请提供任何智慧 -- Shaha3

最佳答案

为什么要递归?

>>> from itertools import chain, combinations_with_replacement
>>> n = 7
>>> [i for i in chain.from_iterable(
combinations_with_replacement(range(1, n), k)
for k in range(2, n+1))
if sum(i) == n]

[(1, 6), (2, 5), (3, 4), (1, 1, 5), (1, 2, 4), (1, 3, 3), (2, 2, 3), (1, 1, 1, 4), (1, 1, 2, 3), (1, 2, 2, 2), (1, 1, 1, 1, 3), (1, 1, 1, 2, 2), (1, 1, 1, 1, 1, 2), (1, 1, 1, 1, 1, 1, 1)]

这个问题随着 n!所以,大数字需要很多时间。

关于python - 将for循环和if语句的递归函数变成迭代函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11464162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com