判断一个数是否能被3整除的递归函数
Recursive function to know if a number is divisible by 3
我需要创建一个递归函数,如果输入的数字可以被 3 整除,它 return 我是真的。我知道没有递归它更简单,但我需要创建一个这种类型的函数。
我已经创建了一个函数,但我想知道是否可以创建一个更好的函数,因为 'num',该函数不起作用。我想我应该利用这个事实:一个自然数可以被 3 整除,如果它的数字的总和可以被 3 整除。
这是我的代码:
def divThree(num):
if num==3:
return true
else:
divThree(num-3)
编辑:我创建了一个更好的函数,但我不明白为什么 return 如果数字可以被 3 整除,我就不对了。相反,如果不是,则继续最大递归错误。
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)
使用 3 作为除数时,您需要检查数字是否有零余数。
使用 %
运算符检查余数。因此,如果您想查看某个数是否可以被 3 整除,请使用 num % 3 == 0
如果余数为零,则该数可以被 3 整除。
这 returns 正确:
print (6 % 3 == 0)
returns True
这个returns错:
print (5 % 3 == 0)
returns False
这是一个简单的函数来检查真假:
def divThree(numb):
return numb % 3 == 0
print (divThree(99))
编辑:
我不确定你要检查的数字有多大,但我用我认为很大的数字测试了这个函数并且它起作用了。我可能只是不明白你需要考虑什么。
def divThree(numb):
return numb % 3 == 0
print (divThree(4325609549876542987503216540321540104986213754901245217346214390735402153407213540213457183254098263487053214132754073254921534987053245321454))
Returned True
您可以使用模数然后将其减去 num
来找出要使数字被 3 整除需要多少时间
def divThree(num):
if num % 3 == 0:
return True
a = num % 3
return divThree(num-a)
你递归放大要减去的因子:
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
- 最直接的解决方案是使用模 3 检查
可分性,但这不会是递归的。
- 另一种解决方案是递归地一直除以 3,直到减到 1,但对于大值,这会导致堆栈溢出。
- 第三种适合递归的解决方案是利用 属性 如果一个数的各位数字之和可以被 3 整除,那么这个数也可以被 3 整除。
这是避免模运算并处理非常大的数字的第三个选项的实现:
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)
作为要执行的第一个检查。
这是一种晦涩的方法,有几个更好的答案,但是实现同余定理,你可以说:
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[= 整除35=]。 (其中 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 用类似的解决方案击败了我。
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);
}
是的,它是递归的。给你的老师的练习:找到错误。
我需要创建一个递归函数,如果输入的数字可以被 3 整除,它 return 我是真的。我知道没有递归它更简单,但我需要创建一个这种类型的函数。
我已经创建了一个函数,但我想知道是否可以创建一个更好的函数,因为 'num',该函数不起作用。我想我应该利用这个事实:一个自然数可以被 3 整除,如果它的数字的总和可以被 3 整除。
这是我的代码:
def divThree(num):
if num==3:
return true
else:
divThree(num-3)
编辑:我创建了一个更好的函数,但我不明白为什么 return 如果数字可以被 3 整除,我就不对了。相反,如果不是,则继续最大递归错误。
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)
使用 3 作为除数时,您需要检查数字是否有零余数。
使用 %
运算符检查余数。因此,如果您想查看某个数是否可以被 3 整除,请使用 num % 3 == 0
如果余数为零,则该数可以被 3 整除。
这 returns 正确:
print (6 % 3 == 0)
returns True
这个returns错:
print (5 % 3 == 0)
returns False
这是一个简单的函数来检查真假:
def divThree(numb):
return numb % 3 == 0
print (divThree(99))
编辑:
我不确定你要检查的数字有多大,但我用我认为很大的数字测试了这个函数并且它起作用了。我可能只是不明白你需要考虑什么。
def divThree(numb):
return numb % 3 == 0
print (divThree(4325609549876542987503216540321540104986213754901245217346214390735402153407213540213457183254098263487053214132754073254921534987053245321454))
Returned True
您可以使用模数然后将其减去 num
来找出要使数字被 3 整除需要多少时间 def divThree(num):
if num % 3 == 0:
return True
a = num % 3
return divThree(num-a)
你递归放大要减去的因子:
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
- 最直接的解决方案是使用模 3 检查 可分性,但这不会是递归的。
- 另一种解决方案是递归地一直除以 3,直到减到 1,但对于大值,这会导致堆栈溢出。
- 第三种适合递归的解决方案是利用 属性 如果一个数的各位数字之和可以被 3 整除,那么这个数也可以被 3 整除。
这是避免模运算并处理非常大的数字的第三个选项的实现:
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)
作为要执行的第一个检查。
这是一种晦涩的方法,有几个更好的答案,但是实现同余定理,你可以说:
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[= 整除35=]。 (其中 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 用类似的解决方案击败了我。
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);
}
是的,它是递归的。给你的老师的练习:找到错误。