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