gpt4 book ai didi

python - 在递归中使用 return 的地方

转载 作者:太空狗 更新时间:2023-10-29 15:54:12 24 4
gpt4 key购买 nike

在 C 中这段代码有效,这里我在递归调用函数时没有使用 return。它给出正确的输出

int gcd(int a, int b)
{
if(b == 0)
return a;
gcd(b, a % b);
}

但是,如果我在 python 中编写相同的代码,此代码将返回 None(我认为应该从 if 条件中的 return 语句返回值)

def gcd(a, b):
if b == 0:
return a
gcd(b, a % b)

为了使这段代码工作,我必须添加返回

def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)

但是为什么? C 和 Python 代码执行之间的本质区别是什么?如果我在递归调用时添加额外的返回,C 中的代码也可以工作,为什么它不抛出错误?

最佳答案

为什么?错误的假设。顺便说一句,这不是关于 Python 的问题,而是关于 C 的问题。

您的 C 代码无效。它有 undefined behaviour因为您使用函数调用的返回值,而控制路径并未使用return 语句实际返回一个值。如果您使用正确的选项/设置进行编译,您的编译器可能会对此发出警告。 IE。这不是编译 C 程序的方式:

% gcc -c 123.c

相反,您启用所有警告,将它们变成错误。例如在 GCC -Wall-Wextra-Werror-pedantic

% gcc -c 123.c -Wall -Wextra -Werror -pedantic
123.c: In function ‘gcd’:
123.c:6:1: error: control reaches end of non-void function [-Werror=return-type]
}
^
cc1: all warnings being treated as errors

不幸的是,周围有各种各样的错误代码,这意味着 C 编译器默认情况下比真正需要的更宽松。另一个问题是,在 C 中省略 return 语句甚至都不算错——只是使用垃圾返回值才是。

Python 没有类似 C 的未定义行为,因此当您省略 return 语句时,该函数会隐式返回 None,并且您不会得到一些随机垃圾这看起来好像您的损坏代码有效。


更正确的函数定义是

int gcd(int a, int b)
{
if(b == 0)
return a;
return gcd(b, a % b);
}

然而,也许这些参数应该是 unsigned int,这样您就不会认为这对于负数总是正确的。

关于python - 在递归中使用 return 的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46473973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com