在Python中使用递归

时间:2013-04-08 17:25:25

标签: python recursion

我正在尝试使用递归来解决问题,如果我使用'if'语句,这将非常冗长。我想看看CONST = 50的次数是多少次。我想返回50在n中出现的次数。我知道这是直截了当的,但我想用递归来实现这一点,这对我来说并不是直截了当的。条件如下:

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"""
       ...
       ...
       ...

提前感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

对于这个特定问题,你应该使用一个部门:

count = n // 50 + 1  

(注意使用双斜线,而不仅仅是“/” - 那 你甚至在Python 3上执行整数除法, 结果响了下来,而不是给你一个浮点 价值作为结果)

现在,关于递归 - 它不是解决Python问题的首选方式 - 可能具有相同成本的重复函数 “为功能调用优化”中的“for循环” 与方案一样,语言最好处理forwhile循环。

保持这个例子 - 并导致递归 - 你需要改变它们 您的数据输入以及每次交互时的结果 - 以便何时进行 您的数据不需要记录器处理,您最后得到了结果:

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

从这里开始,更容易检查递归方法应该做什么: 每次过度调用都应该收到“n”和“count”的修改值 比上一次迭代。你可以利用Python的优势 可选参数语法,以便第一次调用该函数 必须添加“count”参数:

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

由于在解释器上设置了调用堆栈深度,因此在Python中限制为n =约50000,并且默认最大重合深度设置为1000.您可以通过在{{1}中设置它来更改该数字}模块 - 但这不是Python中推荐的方法 - 无论是函数调用的开销,还是syswhie结构的更高级别的工具。对于一些可以递归2到100次的函数来说显然是可以的,比如处理文件路径,URL部分等等 - 特别是如果函数最终比交互式对应函数更具可读性。

答案 1 :(得分: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

答案 2 :(得分:0)

怎么样。

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

如果你所追求的结果不是1,每个dvisable为50,实际上在1到50 = 1之间,51到100 = 2之间,那么

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