【问题标题】:Python recursive function call with if statement使用 if 语句调用 Python 递归函数
【发布时间】:2017-12-05 21:54:44
【问题描述】:

我有一个关于使用 if 语句和递归的函数调用的问题。 我有点困惑,因为即使我的函数返回“False”,python 似乎也会跳入 if 语句块

这是一个例子:

1    def function_1(#param):
2       if function_2(#param):
3           #do something
4           if x<y:
5               function_1(#different parameters)
6           if x>y:
7               function_1(#different parameters)

我的 function_2 返回“False”,但 python 继续执行第 5 行的代码。谁能解释这种行为?提前感谢您的任何回答。

编辑:对不起,忘记括号

具体例子:

1    def findExit(field, x, y, step):
2        if(isFieldFree(field, x, y)):
3            field[y][x] = filledMarker
4            findExit(field, x + 1, y, step+1)
5            findExit(field, x - 1, y, step+1)
6            findExit(field, x, y + 1, step+1)
7            findExit(field, x, y - 1, step+1)
8        elif(isFieldEscape(field, x, y)):
9            way.append(copy.deepcopy(field))
10            wayStep.append(step+1)

    def isFieldFree(field, x, y):
        if field[y][x] == emptyMarker:
            return True
        else:
            return False

    def isFieldEscape(field, x, y):
        if field[y][x] == escapeMarker:
            return True
        else:
            return False

在 "isFieldFree" 和 "isFieldEscape" 两个函数都返回 False 后,python 会继续第 5 行的代码,有时会在第 6 行。

【问题讨论】:

  • if function_2: 你确定这是你的意思吗? function_2 是一个函数吗?
  • 没有更具体的例子,真的帮不上忙。从上面看,如果function_2() 返回False,则递归结束。
  • @AChampion 感谢您的回复,添加了一个具体的例子。这是一个使用递归函数调用解决迷宫的示例。

标签: python function if-statement recursion


【解决方案1】:

简答:

那是因为您实际上并没有调用该函数。您可以使用括号调用该函数。

if function2():
    ...

长答案:

Python 中的函数是一等公民(函数范式),因此仅通过函数名称来引用函数是完全有效的。以下是有效的语法:

def hello():
    print("Hello")

hello_sayer = hello
hello_sayer() # print "Hello"

下一个概念是非布尔变量的真实性。 在 Python 中,以下被认为是 False-y

  • 错误
  • 任何数字类型的零,例如,0、0L、0.0、0j。
  • 任何空序列,例如,''、()、[]。
  • 任何空映射,例如 {}。用户定义类的实例,如果该类定义了
  • nonzero() 或 len() 方法,当该方法返回 整数零或布尔值 False。

其他一切都是真实的。由于函数名称不属于上述任何类别,因此在条件上下文中进行测试时,它被认为是 True-ish。

参考:https://docs.python.org/3/library/stdtypes.html#truth-value-testing

编辑:前面的问题不完整,没有函数调用。对于新问题,AChampion 的答案是正确的。

【讨论】:

  • 已更新,因此文档链接使用 Python 3。Python 2.4 太旧,无法参考。
  • 注意:OP 更新了问题,这并没有解决他的实际问题。
【解决方案2】:

您可能误解了递归的工作原理,是的,它在第 5 行或第 6 行继续,因为递归在调用堆栈中的较低级别结束,因此它在调用堆栈中的较高级别继续。这是一个示例调用堆栈,注意False 之后的下一个操作是更高调用堆栈的下一个findExit()

1 findExit(...):
2    True:
3        field assignment
4.1      findExit(x+1) 
  2          True
  3              field assignment
  4.1            findExit(x+1):
    2                False  # Does not jump to line 5 in current call stack.
  5.1            findExit(x-1):
    .                ...

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多