首页 > 解决方案 > 替代全局变量

问题描述

我有一个递归函数,它反转一个整数。反转后的 Integer 不能以 0 开头,例如:12340 变成 4321。

res = 0
base = 1


def reverse(n):

    global res
    global base

    if n > 0:
        reverse(n // 10)
        res = res + (n % 10) * base
        base = base * 10

    return res

这段代码有效,但只有一次,因此我想摆脱全局变量。我想到了一个辅助函数,在函数内部reverse(n),但我无法让它正常工作。我已经尝试了将近一个小时,并希望最终看到解决方案。

标签: pythonrecursion

解决方案


使用辅助方法完全有可能:

def reverse_recursive(i: int) -> int:
    def helper(i: int, result_up_to_now: int) -> int:
        if i == 0:
            return result_up_to_now
        return helper(i // 10, result_up_to_now * 10 + (i % 10))
    return helper(i, 0)

assert reverse_recursive(123456789) == 987654321

即使没有:

def reverse_recursive_nohelper(i: int, result_up_to_now=0) -> int:
    if i == 0:
        return result_up_to_now
    return reverse_recursive_nohelper(i // 10, result_up_to_now * 10 + (i % 10))

assert reverse_recursive_nohelper(123456789) == 987654321

但后者当然可能被某人误用/误解。

只是为了比较,非递归版本:

def reverse_straight(i: int) -> int:
    result = 0
    while i != 0:
        result = result*10 + i % 10
        i //= 10
    return result

assert reverse_straight(123456789) == 987654321

推荐阅读