Python递归(格式问题)

Python递归(格式问题),python,Python,编写一个递归函数replace_digit(n,d,r),用r替换数字n中出现的每个数字d 替换数字(31242154125,1,0)=>30242054025 我的代码就是这样 def replace_digit(n, d, r): y=str(n) if len(y)==0: return '' else: if y[0]== str(d): return str(r) + replace_digit(str(n

编写一个递归函数
replace_digit(n,d,r)
,用
r
替换数字
n
中出现的每个数字
d

替换数字(31242154125,1,0)
=>
30242054025

我的代码就是这样

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

然而,我得到的答案是字符串格式的。知道如何转换成整数格式吗?我在这个问题上已经纠结了很长一段时间:(

如果递归函数必须返回整数,那么就返回整数。对于递归调用,您始终可以将返回的整数转换回字符串

在调用之前,当数字用完时,您必须停止,因此只有当
y
中有2个或更多字符时,才会递归

但是,这种方法存在一个大问题:在转换为
int()时,前导零被删除。

>>> int('025')
25
这里有两个选项:

  • 在转换为字符串时填充数字(使用或,并使用传入递归调用的值的长度)
  • 从末尾递归。这也允许您不使用字符串
下面是一种使用零填充的方法:

def replace_digit(n, d, r):
    nstr = str(n)
    first, rest = nstr[0], nstr[1:]
    if rest:
        rest = str(replace_digit(rest, d, r)).zfill(len(rest))
    if first == str(d):
        first = str(r)
    return int(first + rest)
请注意,您始终希望将第一个字符与尾部分开,因此我对这两个字符都使用了变量

通过这种方式,您可以使用
if rest:
来防止在没有剩余数字的情况下递归,并且可以对返回值调用
str()
。该函数使用更新的
rest
值返回(可能替换的第一个值)的
int()
转换

演示:

从另一端递归不会出现零的问题,除非输入值是
0
。但是,您可以使用除法和模块操作直接处理整数值:

  • number%10
    为您提供最右边的整数位数
  • number//10
    提供剩余的数字,同样是整数
您可以使用将这两个操作合并为一个。就我个人而言,我不这样做,因为我认为它不会特别提高可读性,而且

通过将返回值再次乘以10,可以将递归调用结果与(可能替换的)最后一位数字重新组合:

def replace_digit(n, d, r):
    head, last = n // 10, n % 10
    if head:
        head = replace_digit(head, d, r)
    if last == d:
        last = r
    return (head * 10) + last
这适用于任何自然数,包括0:

>>> replace_digit(0, 1, 0)
0
>>> replace_digit(0, 0, 1)
1
>>> replace_digit(31242154125, 1, 0)
30242054025
>>> replace_digit(31242154125, 4, 9)
31292159125

返回一个整数(
int(string\u value)
),并将递归调用返回的值再次转换为字符串。啊,这里有一个问题:以
0
开头的数字将丢失该数字。您是否有进一步的说明,说明您需要在哪个方向处理这些数字?不是真的,我只需要得到显示的数字,其中“1”变为“0”是否有w嗯,可能有一个类似于我的代码?我对零还是有点陌生-padding@WeiHan:对不起,这是你自己的事。我给了你所有正确解决这个问题的选择。
>>> replace_digit(0, 1, 0)
0
>>> replace_digit(0, 0, 1)
1
>>> replace_digit(31242154125, 1, 0)
30242054025
>>> replace_digit(31242154125, 4, 9)
31292159125