C++ 基本C++;递归程序问题 //此程序使用通过 //欧几里德算法 #包括 #包括 使用名称空间std; 国际通用数据表(国际通用数据表A、国际通用数据表B); int main() { INTA=45,B=55; cout

C++ 基本C++;递归程序问题 //此程序使用通过 //欧几里德算法 #包括 #包括 使用名称空间std; 国际通用数据表(国际通用数据表A、国际通用数据表B); int main() { INTA=45,B=55; cout,c++,recursion,C++,Recursion,使用return GCD(A,B);version,调用GCD(A,B)的结果将返回给父级。如果跳过return语句,则返回的结果将丢失,并且不会传递给调用GCD() 也就是说,在“C”中,必须使用函数的return语句来返回值。使用return GCD(a,B);version,调用的结果GCD(a,B)返回到父级。如果跳过return语句,则返回的结果将丢失,并且不会传递给调用GCD() 也就是说,在“C”中,必须使用函数的return语句来返回值 我知道函数(除非它们是void类型)必须返

使用
return GCD(A,B);
version,调用
GCD(A,B)
的结果将返回给父级。如果跳过
return
语句,则返回的结果将丢失,并且不会传递给调用
GCD()

也就是说,在“C”中,必须使用函数的
return
语句来返回值。

使用
return GCD(a,B);
version,调用的结果
GCD(a,B)
返回到父级。如果跳过
return
语句,则返回的结果将丢失,并且不会传递给调用
GCD()

也就是说,在“C”中,必须使用函数的
return
语句来返回值

我知道函数(除非它们是void类型)必须返回一个值。也许这个规则也适用于递归函数调用

是的。如果不使用return语句,则函数的返回值未定义

我知道函数(除非它们是void类型)必须返回一个值。也许这个规则也适用于递归函数调用


是的。如果不使用return语句,则函数的返回值是未定义的。

如果不返回值,则返回的值是未定义的。因此,如果If/else If不匹配,则返回不可预测的值(取决于编译器/编译器标志/运行程序的时间/…)。 因此,调用方法将计算错误的结果


递归和非递归方法和函数也是如此。

如果不返回值,则返回的值未定义。因此,如果If/else If不匹配,则返回不可预测的值(取决于编译器/编译器标志/运行程序的时间/…)。 因此,调用方法将计算错误的结果

这对于递归和非递归方法和函数都是如此

也许这条规则也适用于递归函数调用

为什么要应用不同的规则?递归函数的工作原理与普通函数完全相同

顺便说一下,您的程序包含一个错误:

//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;
    }
}
这不是一个比较,而是一个任务——而且测试是不必要的,因为所有其他条件(
a
a>B
)都已经测试过了

也许这条规则也适用于递归函数调用

为什么要应用不同的规则?递归函数的工作原理与普通函数完全相同

顺便说一下,您的程序包含一个错误:

//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;
    }
}
这不是一个比较,它是一个赋值,而且测试是不必要的,因为所有其他条件(
a
a>B
)都已经过测试。

也许这个规则也适用于递归调用

当然,递归不是特例。您的函数需要返回一些东西,在这种情况下,需要返回的是递归调用的返回值

还有另一个无声错误:您编写了
(A=B)
而不是
(A==B)

可能此规则也适用于递归调用。”

当然,递归不是特例。您的函数需要返回一些东西,在这种情况下,需要返回的是递归调用的返回值


还有另一个无声错误:您编写了
(A=B)
而不是
(A==B)
解决这个问题的方法是嵌套函数调用。外部的
GCD
调用内部的
GCD
,而内部的
GCD
。当您到达最内部的调用时(其中
A==B
),您将
返回一个
,该返回将通过所有您返回的值传播,直到到达最外层的
GCD
,这将返回正确的值。没有这些返回,最内层调用的结果将永远不会传递到外部世界

尝试写下函数对简单值的作用,您将看到这种嵌套行为


编辑:如果您一直在使用Lisp,您可能会感到困惑,因为Lisp会自动返回函数的最后一行。

解决这一问题的方法是嵌套函数调用。外部的
GCD
调用内部的
GCD
,当您到达最内部的调用时,它又调用内部的
GCD
(其中
A==B
),您将
返回A
,该返回将通过所有您返回的值传播,直到到达最外层的
GCD
,它将返回正确的值。没有这些返回,最内层调用的结果将永远不会传递到外部世界

尝试写下函数对简单值的作用,您将看到这种嵌套行为


编辑:如果您一直在使用Lisp,您可能会感到困惑,因为Lisp会自动返回函数的最后一行。

请正确设置代码格式好吗?只需标记代码并按Ctrl+K即可。请正确设置代码格式好吗?只需标记代码并按Ctrl+K即可。@rstevens-谢谢您指出这一点。从现在开始,我将这样做。然后ks伙计们!我很感谢你们的回答!我不敢相信我做了A=B而不是A=B的比较。你们能告诉我我是个傻瓜吗:)再次感谢!@rstevens-谢谢你指出这一点。我会从现在开始这样做。谢谢大家!我感谢你们的所有回答!我不敢相信我做了A=B而不是A==B的比较。你能告诉我我是个傻瓜吗:)再次感谢!