我的C ++代码段看起来像这样
int findGcd(int m, int n)
{
int r = m % n;
if(r == 0)
{
return n;
}
else
{
m = n;
n = r;
findGcd(m, n);
}
}
int main()
{
cout << findGcd(13, 3);
return 0;
}
...它返回(与本示例中的预期完全相同)1。
如果我是用Python实现的,则如下所示:
def findGcd(m, n):
"""Calculates the greatest common divider """
r = m % n
if r == 0:
return n
else:
m = n
n = r
findGcd(m, n)
number = findGcd(13,3)
print(number)
它只返回NONE而不是1。我已经调试了它,n确实存储了正确的1值,但是仍然返回None。
我可以通过在else分支的函数的递归调用中添加“ return”来解决此问题。 但是为什么呢?
答案 0 :(得分:1)
在两种情况下,您都需要在递归调用中使用return
。
否则,在C ++中,您将具有未定义的行为。在Python中,您得到None
。
C ++
int findGcd(int m, int n)
{
int r = m % n;
if(r == 0)
{
return n;
}
else
{
m = n;
n = r;
return findGcd(m, n);
}
}
Python:
def findGcd(m, n):
"""Calculates the greatest common divider """
r = m % n
if r == 0:
return n
else:
m = n
n = r
return findGcd(m, n)
您可以通过提高编译器的警告级别来捕获C ++中的此类问题。使用g++ -Wall
,我得到:
socc.cc: In function ‘int findGcd(int, int)’:
socc.cc:16:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^