在网上课上,我收到了这个问题。
写一个函数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
我怎样才能使用基础知识(声明,条件,循环等直到列表推导)递归地实现它?
谢谢!
答案 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