Python Pure Divisor-一个输入



函数的递归调用(或归纳步骤(是什么,该函数返回从1到N的整数数,这些整数将N等分。其想法是在python中为该函数编写一个纯递归代码。没有"for"或"while"循环,这两个模块都不能使用。函数num_of_divisors(42(返回8,表示1、2、3、6、7、14、21和42作为42的除数。

def num_of_divisors(n):
    return sum(1 if n % i==0 else 0 for i in range(((n+1)**0.5)//1)

祝你好运,把它解释给你的老师!

如果你真的不能使用for循环(????(,那么如果不模拟一个循环,这是不可能的。

def stupid_num_of_divisors_assigned_by_shortsighted_teacher(n, loop_num=1):
    """I had to copy this from Stack Overflow because it's such an
    inane restriction it's actually harmful to learning the language
    """
    if loop_num <= (n+1) ** 0.5:
        if n % loop_num == 0:
            return 2 + 
                stupid_num_of_divisors_assigned_by_shortsighted_teacher(n, loop_num+1)
        else:
            return stupid_num_of_divisors_assigned_by_shortsighted_teacher(n, loop_num+1)
    else:
        if n % loop_num == 0:
            return 1

加分:解释为什么在第一个条件中添加2,而在第二个条件中只添加1

给你,伙计,你的老师会很高兴的。

def _num_of_divisors(n, k):
    if (k == 0):
        return 0
    return _num_of_divisors(n, k-1) + (n % k == 0)

def num_of_divisors(n):
    return _num_of_divisors(n, n)

将这样一个简单的问题从循环转换为递归函数比您想象的要容易。

从循环实现开始:

n = 42
result = []
for i in range(n+1):
  if n % i == 0:
     result.append(i)

然后写一个函数

def num_of_divisors_helper(i, n, result):
   if <condition when a number should be added to result>:
       result.append(n)
   # Termination condition
   if <when should it stop>:
       return
   # Recursion
   num_of_divisors_helper(i+1, n, result)

然后定义一个调用num_of_divisors_helper的包装函数num_of_divisors。您应该能够填补递归函数中的空白,并自己编写包装函数。

这是一个简单、低效的解决方案,但它符合您的条件。

不使用%

def is_divisible(n, i, k):
    if k > n:
        return False
    if n - i*k == 0:
        return True
    else:
        return is_divisible(n, i, k+1)
def num_of_divisors(n, i=1):
    if i > n/2:
        return 1
    if is_divisible(n, i, 1):
        return 1 + num_of_divisors(n, i+1)
    else:
        return num_of_divisors(n, i+1)

num_of_divisors(42(->8

def n_divisors(n,t=1):
    return (not n%t)+(n_divisors(n,t+1) if t < n else 0)

祝你以后考试顺利。。。最好把那些书记下来,去上课做笔记。。。

只有一个输入,我想

t=0
def n_divisors(n):
    global t
    t += 1
    return (not n%t)+(n_divisors(n) if t < n else 0)

最新更新