//This program finds the GCD of two numbers using a recursive function call via the
//Euclidean algorithm
#include <iostream>
#include <cmath>
using namespace std;
int GCD (int A, int B);
int main()
{
int A = 45, B = 55;
cout << "The GCD is " << GCD(A,B) << endl;
//test
return 0;
}
int GCD (int A, int B)
{
A = abs(A);
B = abs(B);
if (A > B)
{
A = A - B;
return GCD (A, B); //Recursive function call - works fine
//GCD (A, B); -- This function call seems to return an incorrect value
else if (A < B)
{
B = B - A;
return GCD (A, B);//Recursive function call
//GCD (A, B); -- This function call seems to return an incorrect value
}
else if (A = B)
{
return A;
}
}
这是我的问题:我注意到如果我在递归函数调用中不使用“return”关键字,程序将返回一个不正确的值,但如果我单步执行该函数,则本地值会正确更新。我知道函数(除非它们的类型为void)必须返回一个值。也许这个规则也适用于递归函数调用?
有人可以详细说明/帮助我理解吗?
答案 0 :(得分:7)
也许这个规则也适用于递归函数调用?
为什么要适用不同的规则?递归函数与正常函数一样完全。
顺便说一下,你的程序包含一个错误:
else if (A = B)
{
return A;
}
这不是比较,它是一项任务 - 此外,测试是不必要的,因为所有其他条件(A < B
和A > B
)已经过测试。
答案 1 :(得分:3)
如果您没有返回值,则未定义返回的值。因此,如果你的if / else if匹配你没有返回一个不可预测的值(取决于编译器/编译器标志/你运行程序的那天的时间/ ...)。 因此调用方法将计算错误的结果。
对于递归和非递归方法和函数都是如此。
答案 2 :(得分:1)
我知道函数(除非它们的类型为void)必须返回一个值。也许这个规则也适用于递归函数调用?
是的,确实如此。如果不使用return语句,则函数的返回值是未定义的。
答案 3 :(得分:1)
解决这个问题的方法是嵌套函数调用。外部GCD
调用内部GCD
,后者又调用内部GCD
。当您到达最里面的调用(A == B
)时,您将return A
,并且该返回将传播所有返回值,直到它到达最外面的GCD
,这将返回正确的价值。没有回报,最里面的召唤的结果永远不会进入外界。
尝试使用简单值写下函数的功能,您将看到这种嵌套行为。
编辑:如果你一直在使用Lisp,你可能会感到困惑,因为Lisp会自动返回函数的最后一行。
答案 4 :(得分:0)
使用return GCD(A,B);
版本,调用GCD(A,B)
的结果将返回给父级。如果跳过return
语句,则返回的结果将丢失,并且不会传递给GCD()
的调用调用。
也就是说,在“C”中,必须使用函数的return
语句来返回值。
答案 5 :(得分:0)
“也许此规则也适用于递归调用”
当然,递归不是特例。你的函数需要返回一些东西,在这种情况下,它是需要返回的递归调用的返回值。
还有另一个无声错误:你写了(A=B)
而不是(A==B)