Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用if语句的Python递归函数调用_Python_Function_If Statement_Recursion - Fatal编程技术网

使用if语句的Python递归函数调用

使用if语句的Python递归函数调用,python,function,if-statement,recursion,Python,Function,If Statement,Recursion,我有一个关于使用if语句和递归的函数调用的问题。 我有点困惑,因为python似乎跳入了if语句块,即使我的函数返回“False” 以下是一个例子: 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

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

以下是一个例子:

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)

在两个函数“isFieldFree”和“isFieldEscape”返回False后,python将继续第5行中的代码,有时会在第6行中执行。

简短回答:

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

if function2():
    ...
长答案:

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

def hello():
    print("Hello")

hello_sayer = hello
hello_sayer() # print "Hello"
下一个概念是非布尔变量的真值性。 在Python中,以下内容被视为False-y

  • 没有
  • 假的
  • 任何数字类型的零,例如0、0L、0.0、0j
  • 任何空序列,例如,,(),[]
  • 任何空映射,例如,{}。用户定义类的实例,如果该类定义
  • 非零()或len()方法,当该方法返回 整数零或布尔值为False
其他一切都是真实的。由于函数名不属于上述任何类别,因此在条件上下文中测试时将其视为True

参考:


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

您可能会误解递归的工作原理,是的,它在第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):
    .                ...

如果函数2:
你确定这就是你的意思吗?函数_2是函数吗?如果没有更具体的例子,就没什么帮助了。如果
function_2()
返回
False
,则递归结束。@AChampion感谢您的回复,添加了一个具体示例。这是一个使用递归函数调用解决迷宫的示例。更新后的文档链接使用Python 3。Python2.4太旧了,无法参考。注意:OP更新了问题,但这并没有解决他的实际问题。
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):
    .                ...