使用递归函数

时间:2016-08-18 10:12:26

标签: 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)
        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)

5 个答案:

答案 0 :(得分:1)

def replace_digit(number, digit, replacement):

    if number == 0:
        return number  # base case

    quotient, remainder = divmod(number, 10)

    if remainder == digit:
        remainder = replacement

    return replace_digit(quotient, digit, replacement) * 10 + remainder


print(replace_digit(961748941982451653, 9, 2))

<强>输出

261748241282451653

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您已经有工作功能,为什么不解决问题?

enter code here

答案 3 :(得分:0)

解决方案是使用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

答案 4 :(得分:0)

不要返回连接,而是尝试这个:

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)