Python 递归生成数字和为n的所有k位数字
我在研究一个问题,我找到了所有的k位数字,它们的数字总和是给定的n 我发现了如何做到这一点,并将其作为整数分区问题来处理,但是我希望能够在没有max_元素的情况下只输入n和k个数字,但是当我尝试从代码中删除它时,它似乎不再起作用 我怎样才能改变它加上逆转它 定义cn,k,最大元素: 允许=范围最大\u元素,0,-1 def helpern,k,t: 如果k==0: 如果n==0: 产量t elif k==1: 如果允许n输入: 产量t+n,Python 递归生成数字和为n的所有k位数字,python,python-3.x,algorithm,reverse,Python,Python 3.x,Algorithm,Reverse,我在研究一个问题,我找到了所有的k位数字,它们的数字总和是给定的n 我发现了如何做到这一点,并将其作为整数分区问题来处理,但是我希望能够在没有max_元素的情况下只输入n和k个数字,但是当我尝试从代码中删除它时,它似乎不再起作用 我怎样才能改变它加上逆转它 定义cn,k,最大元素: 允许=范围最大\u元素,0,-1 def helpern,k,t: 如果k==0: 如果n==0: 产量t elif k==1: 如果允许n输入: 产量t+n, elif 1*k这个函数应该可以实现这个功能 def
elif 1*k这个函数应该可以实现这个功能
def c(n, k, max_element):
allowed = range(max_element, 0, -1)
def helper(n, k, t):
if k == 0:
if n == 0:
yield t
elif k == 1:
if n in allowed:
yield t + (n,)
elif 1 * k <= n <= max_element * k:
for v in allowed:
yield from helper(n - v, k - 1, t + (v,))
return helper(n, k, ())
def reversed_iterator(iter):
return reversed(list(iter))
for p in reversed_iterator(c(5, 3, 3)):
print(p)
这个函数应该可以做到这一点
def c(n, k, max_element):
allowed = range(max_element, 0, -1)
def helper(n, k, t):
if k == 0:
if n == 0:
yield t
elif k == 1:
if n in allowed:
yield t + (n,)
elif 1 * k <= n <= max_element * k:
for v in allowed:
yield from helper(n - v, k - 1, t + (v,))
return helper(n, k, ())
def reversed_iterator(iter):
return reversed(list(iter))
for p in reversed_iterator(c(5, 3, 3)):
print(p)
这里有几个问题;首先,您希望数字按顺序排列,而这段代码以相反的顺序生成它们,因为rangemax_元素为0,-1。另一个问题是,由于要生成数字,所以最小元素应为0,最大元素应始终为9。我们可以通过将该范围更改为范围10来解决这两个问题 我们仍然需要小心,不要生成以0开头的数字,因此我们将设置allowed作为参数,并使用range1,10作为第一个数字。我还将其更改为以整数而不是元组的形式返回结果 作为参考,此生成器功能的代码来自 定义cn,k: def帮助器,k,t,允许: 如果k==0: 如果n==0: 产量t elif k==1: 如果允许n输入: 产量10*t+n 对于c5中的p,3: ... printp ... 104 113 122 131 140 203 212 221 230 302 311 320 401 410 500
这里有几个问题;首先,您希望数字按顺序排列,而这段代码以相反的顺序生成它们,因为rangemax_元素为0,-1。另一个问题是,由于要生成数字,所以最小元素应为0,最大元素应始终为9。我们可以通过将该范围更改为范围10来解决这两个问题 我们仍然需要小心,不要生成以0开头的数字,因此我们将设置allowed作为参数,并使用range1,10作为第一个数字。我还将其更改为以整数而不是元组的形式返回结果 作为参考,此生成器功能的代码来自 定义cn,k: def帮助器,k,t,允许: 如果k==0: 如果n==0: 产量t elif k==1: 如果允许n输入: 产量10*t+n 对于c5中的p,3: ... printp ... 104 113 122 131 140 203 212 221 230 302 311 320 401 410 500
@哦,你是对的,我没有注意到。我想要一个不断增长的数字order@ggorlen哦,你说得对,我没有注意到。我想让数字按递增的顺序排列这完全违背了使用迭代器的初衷。反向迭代器在播发时不返回迭代器,它只是耗尽迭代器并返回一个列表。删除max_元素怎么样?有什么建议吗?这完全违背了使用迭代器的初衷。反向迭代器在播发时不返回迭代器,它只是耗尽迭代器并返回一个列表。删除max_元素怎么样?有什么建议吗?他们关闭了我的帖子,所以我用你提到的代码创建了一个新帖子,但我试图删除最大值,因为我只想输入n和kCould,然后使用。join以104形式而不是1,0,4?问题是生成所有k位数字,其数字总和为给定的n-没有任何建议应排除0,除非OP的代码不包括0。我选择不从已知无法解决问题的代码中推断额外的需求。我同意,而且这是一个非常微小的区别。好答案似乎是额外分支的优化和总和检查提供了一个重大的效率提升。他们关闭了我的帖子,所以我用你提到的代码创建了一个新的,但我试图删除最大值,因为我只想输入n和kCould,然后使用。join以104形式而不是1,0,4?问题是生成所有k位数字,其数字总和为给定的n-没有任何建议应排除0,除非OP的代码不包括0。我选择不从已知无法解决问题的代码中推断额外的需求。我同意,而且这是一个非常微小的区别。好的答案似乎是对额外分支的优化和检查总和提供了一个主要的效率提升。
def c(n, k, max_element):
allowed = range(max_element, 0, -1)
def helper(n, k, t):
if k == 0:
if n == 0:
yield t
elif k == 1:
if n in allowed:
yield t + (n,)
elif 1 * k <= n <= max_element * k:
for v in allowed:
yield from helper(n - v, k - 1, t + (v,))
return helper(n, k, ())
def reversed_iterator(iter):
return reversed(list(iter))
for p in reversed_iterator(c(5, 3, 3)):
print(p)
(1, 1, 3)
(1, 2, 2)
(1, 3, 1)
(2, 1, 2)
(2, 2, 1)
(3, 1, 1)