递归函数,以确定一个数字是否可以被3

时间:2017-05-24 18:29:20

标签: python python-2.7 math recursion division

我需要创建一个递归函数,如果输入数字可以被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)

6 个答案:

答案 0 :(得分:7)

  • 最直接的解决方案是使用modulo 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)

作为第一次检查。

答案 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);
}

是的,它是递归的。指导老师的练习:查找错误。