我需要创建一个递归函数,如果输入数字可以被3整除,则返回true。我知道没有递归会更简单,但是我需要创建一个这种类型的函数。
我已经创建了一个函数,但是我想知道是否可以创建一个更好的函数,因为这个函数不起作用。我认为我应该使用这个事实:如果数字的总和可以被3整除,则自然数可以被3整除。
这是我的代码:
def divThree(num):
if num==3:
return true
else:
divThree(num-3)
编辑:我创建了一个更好的功能,但我不明白为什么如果数字可以被3整除则不会返回true。相反,如果不是,则继续发生最大递归错误。
def recursiveThree(num):
if num==3 or num==6 or num==9:
return true
else:
sum=0
sNum=str(num)
for i in range(0,len(sNum)):
sum=sum+int(sNum[i])
recursiveThree(sum)
答案 0 :(得分:7)
这是第三个选项的实现,它避免了模运算并处理了非常大的数字:
def divThree(num):
if num < 10:
return (num in [3, 6, 9])
else:
return divThree(sum([int(digit) for digit in str(num)]))
如果您想将其整除为3,则可以在第一个return
的列表中添加0。
如果您想同时包含正值和负值,请添加前缀:
if num < 0:
return divThree(-num)
作为第一次检查。
答案 1 :(得分:0)
当使用3作为除数时,您需要检查数字是否为零余数。
使用%
运算符检查余数。因此,如果您想查看某些内容是否可被3整除,则使用num % 3 == 0
如果余数为零,则该数字可以被3整除。
返回true:
print (6 % 3 == 0)
returns True
返回False:
print (5 % 3 == 0)
returns False
这是一个检查True of False的简单函数:
def divThree(numb):
return numb % 3 == 0
print (divThree(99))
编辑:
我不确定你要检查的数字有多大,但我测试了这个函数,我认为它是一个很大的数字并且它有效。我可能只是不明白你需要的是什么。
def divThree(numb):
return numb % 3 == 0
print (divThree(4325609549876542987503216540321540104986213754901245217346214390735402153407213540213457183254098263487053214132754073254921534987053245321454))
Returned True
答案 2 :(得分:0)
您可以找出使用模数将数字除以3然后将其减去num的数据
def divThree(num):
if num % 3 == 0:
return True
a = num % 3
return divThree(num-a)
答案 3 :(得分:0)
递归地放大要减去的因子:
def divisible_by_tree(num, factor=3):
if factor < num:
num = divi(num, factor * 2)
if num >= factor:
num -= factor
if factor > 3:
return num
return num == 0
答案 4 :(得分:0)
这是一种模糊的方法,有几个更好的答案,但实现一致的定理,你可以说:
from random import randint # For test trials
def isDivisByThree(n):
sN = str(n)
if(len(sN) == 1):
bIsProductOfThree=True if(n==3 or n==6 or n==9) else False
return bIsProductOfThree
else:
sumOfDigits = 0
for x in sN:
sumOfDigits += int(x)
# end for
return isDivisByThree(sumOfDigits)
# end if
# end isDivisByThree(...)
def main():
for testTrialCount in range(1, 35+1):
testSubject = randint(1, 2147483647)
result = isDivisByThree(testSubject)
if(result):
print("Test Trial #" + str(testTrialCount) + ": " + str(testSubject) + " is divisble by 3!")
else:
print("Test Trial #" + str(testTrialCount) + ": " + str(testSubject) + " is NOT divisble by 3.")
# end if
# end for
# end main()
main()
这是因为与同义词的应用相关的一个定理表明:如果 d|(b-1)
那么 n = (a_k * ... * a_1 * a_0)
可以被整除d 当且仅当数字 a_k + ... + a_1 + a_0
的总和可被 d 整除时。 (其中d
是除数(本例中为3),b
是表示数字的基数(本例中为10)。)
前10个试验的示例输出:
Test Trial #1: 458327921 is NOT divisble by 3.
Test Trial #2: 23787660 is divisble by 3!
Test Trial #3: 820562190 is divisble by 3!
Test Trial #4: 1466915534 is NOT divisble by 3.
Test Trial #5: 1395854683 is NOT divisble by 3.
Test Trial #6: 1844052852 is divisble by 3!
Test Trial #7: 261731131 is NOT divisble by 3.
Test Trial #8: 624183104 is NOT divisble by 3.
Test Trial #9: 788686237 is NOT divisble by 3.
Test Trial #10: 1075010016 is divisble by 3!
...
修改强>:
啊,我看到pjs用类似的解决方案打败了我。
答案 5 :(得分:0)
在C语言中(易于翻译)
bool divisible_by_three (int x) {
if (x < 0) return divisible_by_three (-x);
else if (x >= 3) return divisible_by_three (x % 3);
else return (x == 0);
}
是的,它是递归的。指导老师的练习:查找错误。