如何输出一个简单的递归函数来输出一个数字的除数?

时间:2016-07-21 01:26:13

标签: python recursion

在网上课上,我收到了这个问题。

写一个函数numDivisors(N),它返回从1到N(包括)的整数数,它们均匀地除以N.例如,numDivisors(42)将返回8,因为1,2,3,6,7,14,21和42是42的除数。(Python 2.7)

虽然我已经用循环解决了它,但我想知道如何通过递归解决这个问题。

带循环的此函数的基本功能是:

def numDivisors( N ):    
    """ returns # of integers that divide evenly into N """
    divisors = 1 # the factor 1
    if N != 1:
      divisors += 1 # the factor N

    for i in range(2,int(N)): # loops through possible divisors
      if N % i == 0: # factor found
        divisors += 1
    return divisors

我怎样才能使用基础知识(声明,条件,循环等直到列表推导)递归地实现它?

谢谢!

2 个答案:

答案 0 :(得分:1)

怎么样

def find_divisors(N,i=1):
    if i >= N**0.5+1: return set([])
    if N%i == 0: return set([i,N//i]).union(find_divisors(N,i+1))
    return find_divisors(N,i+1)

递归是解决这个问题的一个非常糟糕的解决方案......你真的需要找到所有的除数吗?或者你在寻找一个特别的?

答案 1 :(得分:1)

如果我们必须递归:

>>> def ndiv(N, i=1):
...    return 1 if N==i else ((N % i == 0) + ndiv(N, i+1))
... 

我们来试试吧。根据问题:

  

例如,numDivisors(42)将返回8

>>> ndiv(42)
8

因此,这会产生所需的输出。

如果我们可以取消递归,这里只是使用列表理解:

>>> def div(N):
...     return sum(1 for i in range(1, N+1) if N % i == 0)
... 
>>> div(42)
8