Python 避免字符串+;使用递归函数时的整数加法

Python 避免字符串+;使用递归函数时的整数加法,python,python-3.x,recursion,Python,Python 3.x,Recursion,我试图构建一个函数(使用函数递归)来扫描一个数字n以查找数字d,如果找到了,我想用指定的数字r替换d,如下面的代码所示。此代码工作正常,但输出为字符串格式。我尝试了很多方法将其更改为输出一个整数,但都没有效果。谢谢你的帮助 def replace_digit(n, d, r): number = str(n) i = 0 if len(number) == 1: if number == str(d): return str(r)

我试图构建一个函数(使用函数递归)来扫描一个数字n以查找数字d,如果找到了,我想用指定的数字r替换d,如下面的代码所示。此代码工作正常,但输出为字符串格式。我尝试了很多方法将其更改为输出一个整数,但都没有效果。谢谢你的帮助

def replace_digit(n, d, r):
    number = str(n)
    i = 0
    if len(number) == 1:
        if number == str(d):
            return str(r)
        else:
            return number
    else:
        if number[i] == str(d):
            return number[:i] + str(r) + replace_digit(int(number[i+1:]),d,r)
        else:
            return number[i] + replace_digit(int(number[i+1:]),d ,r)

这很简单,但需要在
str
int
之间进行一些类型转换:

def replace_digit(n, d, r):
    number = str(n)
    rest = str(replace_digit(int(number[1:]), d, r)) if len(number) > 1 else ""
    digit = number[0]
    digit = str(r) if digit == str(d) else digit
    return int(digit + rest)
还有另一种可能性,使用包装器。这限制了类型转换的数量

def replace_digit(n, d, r):
    def replace(n, d, r):
        rest = replace(n[1:], d, r) if len(n) > 1 else ""
        return r + rest if n[0] == d else n[0] + rest

    return int(replace(str(n), str(d), str(r)))

如果你已经有了一个工作函数,为什么不把问题分解呢

def replace(n, d, r):
    def replace_digit(n, d, r): # doesn't change
        return ...
    return int(replace_digit(str(n), str(d), str(r))

解决方案是使用
int()
包装返回值,正如注释和其他答案中所述

但这里有一个版本根本不使用字符串操作。只是为了好玩

def replace_digit(n, d, r):
    rest = n // 10  # all but the rightmost digit
    digit = n - rest * 10  # only the rightmost digit
    digit = r if digit == d else digit
    if rest == 0:
        return digit

    return replace_digit(rest, d, r) * 10 + digit

请尝试以下操作,而不是返回连接:

if number[i] == str(d):
    new_number = number[:i] + str(r) + replace_digit(int(number[i+1:]),d,r)
else:
    new_number = number[i] + replace_digit(int(number[i+1:]),d ,r)

return int(new_number)
输出

261748241282451653

这是练习吗?换句话说,您是否明确要求使用递归?这是一项非常简单的任务。只需将返回值包装在对
int()
的调用中即可。是的,我必须专门用递归编写,因此出现了问题。谢谢,非常感谢!正在接近这样的解决方案。:)令人惊叹的。我也在考虑一个纯粹基于整数计算的解决方案,但我感觉OP实际上正在努力理解类型转换。
261748241282451653