函数的递归调用(或归纳步骤(是什么,该函数返回从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)