2015-09-30 45 views
-3

函数的递归调用(或归纳步骤)是什么,该函数返回的整数数量从1到N,它们均匀分割N.这个想法是将一个纯递归代码python这个函数。没有'for'或'while'循环,两个模块都不能使用。功能num_of_divisors(42)返回图8,表示​​1,2,3,6,7,14,21,和42的42Python纯递归 - 除数 - 一个输入

+0

你尝试过什么了吗? –

+0

没有模块?真? – Dleep

+0

限制的要点是什么?这是一个好奇心还是一个学术任务? –

回答

1
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

+0

优秀的答案;-) – sascha

+1

除了它使用循环...所以它违反了术语:)但是是 –

+0

@JoranBeasley我其实错过了。这是荒谬的。无论如何,更新,以便它符合任务的精神。 –

0
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) 
+1

哦,你可以做得比这更好!检查(n + 1)/ 2中的所有t是否足够 –

+0

哦,我知道......但是我原本是这么做的......但是后来我觉得如果他把它放在自己身上,我会留下至少一些改进的东西(加上我没有必要做一个特殊的情况下添加自己的数字:P) –

+0

是的,即使你知道这是别人的任务,你也很难忍住自己。当我写我的解决方案时,对我来说很难:-) – cg909

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) 
+0

哈哈,伟大的思想思维相反:P + 1 –

+0

两个输入。 (n,k)。唯一的输入是N - 或(n)。这条指令简单地实现了等分和,准确地说明了公式如何:num_of_divisor(12)= 1^0 + 2^0 + 3^0 + 4^0 + 6^0 + 12^0,这转换为:= 1 + 1 + 1 + 1 + 1 + 1 = 6.谢谢! – HandyFrank

0

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

开始用循环实现:

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调用num_of_divisors_helper。您应该能够填充递归函数中的空白并自己编写包装器函数。

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

+0

并非一切都是关于效率。 “自然是一位修理工而不是发明家”递归的纯粹形式不仅是计算机科学的基础,它也是每一个进化步骤的一部分。数学只是我们可以与自然交流的语言,我提议将这个假设实现为一段代码:函数(N)= 1^0 + 2^0 + 3^0 + 4^0 + 6^0 + 12^0 =>我如何添加expoents?他们不必将它们作为一个整数排除在递归步骤之外,它们必须能够添加平方根,所以= 1 + 1 + 1 + 1 + 1 + 1 = 6 – HandyFrank

+0

@HandyFrank我主要写道,提示优化是低效的像在(n + 1)/ 2停止是可能的,不用说太多。 – cg909

0

不使用%

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

+0

我也试过这个!我被拒绝拒绝!不,我= 1。只有一个输入(N) - 或(n)。定义两个函数表示模块:拒绝 - 我也尝试过这一个!毫无疑问!伟大的代码,我可以做到这一点,就像它!然而,这是我对计算机科学理论研究的一部分,与分析数论有关。不寻求有效的代码。这条指令简单地实现了等分和,准确地说明了公式如何:num_of_divisor(12)= 1^0 + 2^0 + 3^0 + 4^0 + 6^0 + 12^0,这转换为:= 1 + 1 + 1 + 1 + 1 + 1 = 6。 – HandyFrank