python - 当数字除以 11 时找到余数的递归函数
问题描述
我应该编写一个递归函数来查找除以 11 时的余数,我必须使用以下规则:
例如,对于号码 918392:
F(918392) = F(2-9+3-8+1-9) = F(-20) = 11 - F(20) = 11 - F(0-2) = 11 - F(-2) = 11 - (11 - F(2)) = 11 - (11-2) = 2
我相信我的代码是正确的,但是在提交时,它给出了 4/9 测试用例的运行时错误。有什么建议可以改进我的代码吗??;< 谢谢!
def rem(number):
sum = 0
j = -1
for i in range(0, len(number)):
sum = sum + (-1)**(i) * int(number[j])
j = j - 1
if 0 <= sum < 11:
return sum
else:
return 11 - rem(str(abs(sum)))
number = str(input())
print(rem(number))
解决方案
有两个问题:
11 的减法应该只在
sum
为负数时发生,如果sum
是 11 或更多(正数),那么你应该进行递归调用,但不要通过从 11 中减去它来“反转”它。在您必须从 11 中减去它的情况下,递归调用有可能返回 0,因此 11 - 0 变为 11,这不是可接受的返回值。在这种情况下,您应该返回 0。所以您需要检测这种情况。
这是该if...else
构造的更正版本:
if 0 <= sum < 11:
return sum
elif sum < 0:
sum = 11 - rem(str(-sum))
return 0 if sum == 11 else sum
else:
return rem(str(sum))
旁注:sum
是一个原生 Python 函数。考虑为您的变量使用不同的名称。
考虑到这一点,一些优化,对负数的支持,并允许参数是字符串或数字类型,代码可以变成:
def rem(number):
total = int(number)
if total >= 0:
total = 0
sign = 1
for dig in reversed(str(number)):
total += sign * int(dig)
sign = -sign
if total < 0:
total = 11 - rem(-total)
return 0 if total == 11 else total
return total if total < 11 else rem(total)
推荐阅读
- azure - 如何在逻辑应用中获取查询参数?
- mysql - Copying data from one table to a new one, but i want the id of the user and not the username in the new one
- java - 在java中的while循环外调用值
- android - Android Studio: Program type already present
- c# - I am not able to upload files in selenium webdriver
- c++ - Write a function that randomly picks a string from array in C++
- dialogflow-es - 如何根据实体创建自定义响应?
- c++ - 如何在 QGraphicsScene 中缩放图像?(Qt 5.11)
- ios - iOS 非订阅应用的免费试用期
- c - 为什么 C 语言中的标签和标识符有不同的命名空间?