递归函数,知道一个数字是否可以被3整除

six*_*ain 0 python math recursion division python-2.7

我需要创建一个递归函数,如果输入数字可以被3整除,则返回true.我知道没有递归会更简单,但是我需要创建一个这种类型的函数.

我已经创建了一个函数,但是我想知道是否可以创建一个更好的函数,因为这个函数不起作用.我认为我应该使用这个事实:如果数字的总和可以被3整除,则自然数可以被3整除.

这是我的代码:

def divThree(num):
    if num==3:
        return true
    else:
        divThree(num-3)
Run Code Online (Sandbox Code Playgroud)

编辑:我创建了一个更好的功能,但我不明白为什么如果数字可以被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)
Run Code Online (Sandbox Code Playgroud)

pjs*_*pjs 7

  • 最直接的解决方案是使用模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)]))
Run Code Online (Sandbox Code Playgroud)

return如果您想将其整除为3,则可以在第一个列表中添加0 .

如果要同时容纳正值和负值,请在前置:

if num < 0:
    return divThree(-num)
Run Code Online (Sandbox Code Playgroud)

作为第一次检查.

  • 鉴于特殊要求,答案很好.值得注意的是,即使`divThree`对于非常大的数字(例如,`10**10**6`)比`%3`检查更低效,因为int - > str转换需要时间二次方位数.(对于`10**10**6`,`divThree`的时间为13.7秒,而基于'%3`的简单函数为0.00143秒.我不敢尝试`divThree`输入`10**10**7`.:-) (2认同)