繁体   English   中英

递归生成所有数位和为 n 的 k 位数字

[英]Recursively generate all k-digit numbers whose digit-sum is n

我正在解决一个问题,我正在查找所有 k 位数字的数字总和给定的 n。

我找到了如何做到这一点并将其作为整数分区问题来处理,但是我希望只能输入 n 和 k 数字(没有 max_element),但是当我尝试从代码中删除它时,它似乎不起作用了。

我怎样才能改变它加上扭转它?

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, ())

for p in c(5, 3, 3):
    print(p)

我尝试使用相反的方法,但显然它在生成器中不起作用。

结果:

(3, 1, 1)
(2, 2, 1)
(2, 1, 2)
(1, 3, 1)
(1, 2, 2)
(1, 1, 3)

预期结果:

113 122 131 212 221 311

这里有几个问题; 第一个是您想要按顺序排列数字,并且此代码以相反的顺序生成它们,因为range(max_element, 0, -1) 另一个问题是,由于您正在生成数字,因此最小元素应为 0,最大元素应始终为 9。我们可以通过将该范围更改为range(10)来解决这两个问题。

我们仍然需要注意不要生成以 0 开头的数字,因此我们将allowed一个参数并仅使用range(1, 10)作为第一个数字。 我还更改了它以将结果作为整数而不是元组返回。

作为参考,这个生成器函数的代码来自我对另一个问题的回答

def c(n, k):
    def helper(n, k, t, allowed):
        if k == 0:
            if n == 0:
                yield t
        elif k == 1:
            if n in allowed:
                yield 10*t + n
        elif 0 <= n <= 9 * k:
            for v in allowed:
                yield from helper(n - v, k - 1, 10*t + v, range(10))

    return helper(n, k, 0, range(1, 10))

例子:

>>> for p in c(5, 3):
...     print(p)
...
104
113
122
131
140
203
212
221
230
302
311
320
401
410
500

这个函数应该可以解决问题

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM