【问题标题】:Recursion program flow递归程序流程
【发布时间】:2018-02-27 00:26:14
【问题描述】:

我有一些递归调用自身的教科书代码。我不明白程序流程。这是代码:

def Recur_Factorial_Data(DataArray):

    numbers = list(DataArray)
    num_counter = 0

    list_of_results = []

    for num_float in numbers:

        n = int(num_float)

1.      result = Recur_Factorial(n)

        list_of_results.append(result)

def Recur_Factorial(num):

        if num == 1:
2.          return num
        else:
            result = num*Recur_Factorial(num-1)
3.         return result

        if num < 0:
            return -1
        elif num == 0:
            return 0
        else:
            return 0

在 Recur_Factorial_Data 中,我遍历数据元素并调用 Recur_Factorial,它将其值返回给调用函数 (Recur_Factorial_Data)。我希望标记为 2(“return num”)和 3(“return result”)的行总是将一个值返回给调用函数,但事实并非如此。例如,当初始值(来自数组 DataArray)为 11 时,该函数重复调用自身,直到 num 为 1;此时,程序落到标记为 2 的行,但它不会循环回到标记为 1 的行。相反,它落到下一行。在标记为 3 的行上也发生了同样的情况——我希望它将结果返回给调用函数,但它在某些情况下会这样做,而在其他情况下则不会。

我希望这是足够的描述来理解我的问题——我只是不知道为什么每次返回都不会循环返回以将结果返回给调用函数。

编辑:Understanding how recursive functions work 的问题非常有帮助,我推荐给任何对递归感兴趣的人。我的问题有点不同——我是在调用递归函数的 Python 代码的程序流上下文中提出的。

【问题讨论】:

标签: python recursion


【解决方案1】:

如果它递归调用自身 10 次,它将处于第 10 级递归,并且应该返回 10 次递归调用的点并返回一个中间结果,然后才从递归函数退出到该位置它被调用的地方。详细了解recursion

同样尝试以这种方式重新排列 Recur_Factorial 函数中的指令:

def Recur_Factorial(num):
    if num < 0:
        return -1
    elif num == 0:
        return 0
    elif num == 1:
        return num
    else:
        return num * Recur_Factorial(num-1)

【讨论】:

  • 谢谢,尼古拉。这很有帮助,但是在替换您的代码之后,我仍然不清楚一件事 - 第一个输入值是 11。它递归调用自身 10 次,每次递减 num 的值直到它达到 1,然后停止在 elif num == 1 处:返回 num。那时,我希望它返回到调用函数,但它不会——它会进入下一行(否则:return num * Recur_Factorial(num-1)),它会再次递归调用自身。为什么到达 elif num == 1 行时不返回调用函数记录数字 1?
  • 现在我明白了。它有助于观察调用堆栈。我们将 RIP 入栈 10 次; 11号我们到达数字1,返回有效。此时,堆栈必须展开 10 次才能返回阶乘的正确答案(在阶乘为 11 的情况下为 39916800)。谢谢,尼古拉。
  • 正确。因此深度递归是危险的。每深入一层,调用栈占用的内存大小就会增加,就可以得到一个异常。在 Python 中,您可以设置递归级别的限制:sys.setrecursionlimit(10000)
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 2014-03-14
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多