1

我正在尝试使用递归来解决问题,如果我使用“if”语句,这将非常冗长。我想看看 CONST = 50 在 n 中有多少次。我想返回 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"""
       ...
       ...
       ...

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

4

3 回答 3

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。您可以通过在sys 模块中设置它来更改该数字 - 但这绝对不是Python 中推荐的方法 - 既针对函数调用的开销,也针对whieandfor构造的更高级别设施。对于某些会递归 2 到 100 次的函数显然是可以的,例如处理文件路径、URL 部分等的函数 - 特别是如果函数最终比交互式对应物更具可读性。

于 2013-04-08T17:29:34.013 回答
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
于 2013-04-08T17:32:21.280 回答
0

怎么样。

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

如果您所追求的结果对于每个 50 的可取值都不是 1 并且实际上介于 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)
于 2013-04-08T17:33:48.173 回答