Python 递归程序

1 投票
1 回答
511 浏览
提问于 2025-04-15 22:31

我刚开始接触编程,之前是学数学的,对Python没有经验。我想知道如何用Python解决我在自学一个数学问题时遇到的这个问题:

程序要求输入一个正整数m。如果m的形式是2^n-1,程序就返回T(m)=n*2^{n-1}。如果不是,程序会把m写成2^n+x的形式,其中-1 < x < 2^n,然后返回T(m)=T(2^n-1)+x+1+T(x)。最后,程序会输出结果。

1 个回答

0

我觉得这个问题挺有意思的,所以我尝试了一下找解决办法。根据我所理解的,这个解决方案应该符合原问题的要求。

#!/usr/bin/python

import math

def calculate(m: int) -> int:
    """
    >>> calculate(10)
    20
    >>> calculate(100)
    329
    >>> calculate(1.2)
    >>> calculate(-1)
    """
    if (m <= 0 or math.modf(m)[0] != 0):
        return None
    n, x = decompose(m + 1)
    if (x == 0):
        return n * 2**(n - 1)
    else:
        return calculate(2**n - 1) + x + 1 + calculate(x)


def decompose(m: int) -> (int, int):
    """
    Returns two numbers (n, x), where
    m = 2**n + x and -1 < x < 2^n
    """
    n = int(math.log(m, 2))
    return (n, m - 2**n)


if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose = True)

假设在calculate函数的单元测试中包含的数字是这个问题的正确结果,那么这个解决方案应该是准确的。当然,欢迎大家提出反馈意见。

撰写回答