我创建了一个递归,应该计算满足 Sertan 条件的数字数量,但由于某种原因它不起作用

问题描述 投票:0回答:1

这是代码:

from functools import lru_cache

@lru_cache(None)

def f(l,d,s):

    if l==12:
        return (len(d)==12 and (all(int(d[i],16)%2!=int(d[i+1],16)%2) \
            for i in range(len(d)-1)))

    if l<12 and all(d[-1]<=h for h in s):return 0

    else:

        return sum(f(l+1,d+j,s=s.replace(j,"")) for j in s if j<d[-1])

print(sum(f(1,d,"0123456789abcdef") for  d in "fedcb"))

我必须计算出有多少个十六进制十二位数字,其中数字按降序排列,偶数与奇数交替。

python recursion
1个回答
0
投票

不需要递归或迭代算法。正如评论中提到的,限制是这样的,您需要计算有多少种方法可以从

'fedcba9876543210'
中删除 4 个字符,并且由于奇/偶约束,您需要删除两个 连续对。例如,您可以删除“ba”和“65”,但不能删除“d”、“9”、“4”、“0”(因为这违反了奇/偶约束)。

对于最左边的连续对,我们有 12 个选择:“fe”、“ed”、“de”、...、“43”、“32”(我们不能选择“21”或“10”,因为这样就没有选择)第二对的选择)。

对于最右边的一对,当我们为第一对选择“fe”时,我们有 12 个选项,当我们选择“ed”时,我们有 11 个选项,...等等。

所以选项总数是 12 + 11 + 10 + ... + 2 + 1。这是一个三角数,所以我们有一个封闭的解决方案公式:12*13/2 = 78。否需要一个程序。

© www.soinside.com 2019 - 2024. All rights reserved.