2013-04-08 65 views
1

我想解决一个使用递归的问题,如果我使用'if'语句,这个问题会非常冗长。我正在查看n有多少次CONST = 50。我想返回50在n中出现的次数。我知道这很简单,但我想用递归来实现这一点,这并不是直截了当的。条件是这样的:在Python中使用递归

0 < n == 50 -> 1 instance 
50 < n <= 100 -> 2 instance 
100 < n <= 150 -> 3 instance 
150 < n <= 200 -> 4 instance 
200 < n <= 250 -> 5 instance 
... 
... 
... 

下面是我开始的,但我卡住了:提前提供任何帮助

def num_of_times(n) 
""" (int) => int 
when n is entered count 1 for every 50 found. If any number is over 50, yet does not 
equal another 50 (e.g. n = 60; 60 - 50 = 10; 50 -> 1; 10 -> 1) will call for a count, which would be a count of 2 in this case. 

>>>num_of_times(60) 
2 
>>>num_of_times(200) 
4 
""" 
    count = 0 

    if n > 0 and n == 50: 
     count += 1 
    elif n > 50: 
     """ Here is where my thinking is going to sleep""" 
     ... 
     ... 
     ... 

感谢。

+4

为什么不使用整数除法之间和,之间= 2等,然后 ? '1 +((n-1)/ 50)' – sfstewman 2013-04-08 17:27:25

+2

或'math.ceil(n/50.0)'。 – 2013-04-08 17:29:33

回答

1

递归似乎是这样做的最无用的方式,但如果需要递归, 试试这个:

def num_of_times(n): 
    if n > 0 and n <= 50: 
     return 1 
    elif n > 50: 
     return 1+num_of_times(n - 50) 
    else: 
     return 0 
+0

这是不正确的,它返回1之间0和49之间的n看到我的版本更简单正确的解决方案 – Yoriz 2013-04-08 18:00:29

+0

但请参阅OP的要求声明:'0 < n == 50 -> 1实例'和'num_of_times(60)== 2'。 – 2013-04-08 18:20:33

+0

嗯,他的问题是混乱的,因为它在文中陈述'我正在查看n次CONST = 50的次数。我想返回n的50次出现次数,然后给出一个例子>>> num_of_times(60) 2其中没有给出的方法得到正确的 – Yoriz 2013-04-08 18:28:23

2

对于这个特定的问题,您应该只使用一个师:

count = n // 50 + 1 

(注意使用双斜杠,而不是“/” - 即 asures你,即使在Python 3的整数除法执行, 其结果roudned下来,而不是给你一个浮点 值作为结果)现在

,约递归 - 它不是解决在Python问题的首选方式 - recusive函数英里ght具有相同的成本 在“优化功能调用”中使用循环“for循环” 语言(如方案)更适合与forwhile循环处理。

这个例子保持 - 并导致递归 - 你需要改变两个 您的数据输入,并将结果在每个互为作用 - 让 数据时不需要logner处理,你yiled最终结果:

count = 0 
while n >= 50: 
    count += 1 
    n -= 50 

,从这里,很容易检查什么应该递归的方法做: 每个逐次调用应该接受修改后的值“N”和“算” 比以前的迭代。你可以把Python的 可选参数语法的利益,这样的函数的第一个调用不 已经添加了“计数”参数:

def num_of_times(n, count=0): 
    if n < 50: 
     return count 
    return num_of_times(n - 50, count + 1) 

这限制为N =约在Python 50000,因在解释器上设置的调用堆栈深度 - 默认的最大recusion深度设置为1000.您可以通过在sys模块中设置该数字来更改该数字 - 但这在Python中并不是建议的方法 - 而是用于函数的开销呼叫以及whiefor构造的更高级别设施。对于一些会递归2至100次的函数,比如处理文件路径,URL部分等等的函数显然是可以的 - 尤其是当函数比交互对象更可读时。

+0

不需要计数看到我之前发布的版本 – Yoriz 2013-04-08 17:43:35

+0

@Yoriz:确实 - 每当我看到这样的代码时,我都会以“尾巴消除”的心态开始思考。这样做时,在进行尾部呼叫时不应在循环功能上留下任何操作。我有一个Python装饰器:http://metapython.blogspot.com.br/2010/11/tail-recursion-elimination-in-python.html – jsbueno 2013-04-09 23:36:47

0

怎么样。

def num_of_times(n): 
    if n < 50: 
     return 0 
    return 1 + num_of_times(n - 50) 

如果结果你后不为1的50每dvisable和实际1 50 = 1 51和100

def num_of_times(n): 
    if n <= 0: 
     return 0 
    elif n < 51: 
     return 1 
    return 1 + num_of_times(n - 50)