【问题标题】:Using return vs no return in recursion?在递归中使用return vs no return?
【发布时间】:2022-01-08 03:25:05
【问题描述】:

这是使用递归反转数组的代码

使用 return rev(arr,++start,--end);

#include <iostream>
using namespace std;

void rev(int arr[],int start,int end)
{
    if(start >= end)
    {
        return;
    }
    int temp = arr[start];
    arr[start] = arr[end];
    arr[end] = temp;
    return rev(arr,++start,--end);
}

void reverse(int arr[],int size)
{
    rev(arr,0,size-1);
}

使用 rev(arr,++start,--end);

void rev(int arr[],int start,int end)
{
    if(start >= end)
    {
        return;
    }
    int temp = arr[start];
    arr[start] = arr[end];
    arr[end] = temp;
    rev(arr,++start,--end);
}

void reverse(int arr[],int size)
{
    rev(arr,0,size-1);
}

它们都给出相同的输出 7 6 5 4 3 2 1

这里使用return和不使用return和rev有什么区别?

【问题讨论】:

  • 在这个具体的例子中没有区别,因为return是函数的最后一条语句,而被“返回”的东西是void。您可以通过比较编译器输出来确认这一点。它们是相同的。
  • 感谢您的回复。我是递归新手,请您通过其他示例进行解释。
  • 在许多情况下,您希望从递归中返回一个值,但在这种情况下,该函数是一个 void 函数
  • 由于rev() 返回voidreturn rev(arr,++start,--end); 在净效应上等同于rev(arr,++start,--end); return; 或(因为它是关闭} 之前函数中的最后一条语句)到@987654330 @

标签: c++ recursion return


【解决方案1】:

没有区别。

来自9.6.3 [stmt.return]

没有操作数的返回语句只能在函数中使用 返回类型为 cv void、构造函数 (15.1) 或析构函数 (15.4)。应使用带有 void 类型操作数的 return 语句 仅在返回类型为 cv void 的函数中。

[...]

流淌 构造函数、析构函数或带有 cv void 的函数的结尾 返回类型等价于没有操作数的返回。

因为函数调用表达式的类型是其签名中定义的函数的cv限定返回类型,并且因为你的函数被定义为返回void,所以这三个以下是等价的:

void f() {
    //stuff
    f();
    return;
}

void g() {
    //same stuff
    return g();
}

void h() {
    //same stuff
    h();
}

【讨论】:

    【解决方案2】:
    #include <iostream>
    using namespace::std;
    
    void rev();
    
    void rev(){
        return 1;
    }
    int main(){
        int val=rev();
        cout<<rev<<endl;
        return 0;
    }
    
    g++ test.cpp -o test
    test.cpp: In function ‘void rev()’:
    test.cpp:7:9: error: return-statement with a value, in function returning ‘void’ [-fpermissive]
        7 |  return 1;
          |         ^
    test.cpp: In function ‘int main()’:
    test.cpp:10:13: error: void value not ignored as it ought to be
       10 |  int val=rev();
    

    编译器正在生成错误,如果返回类型为 void,我们将无法返回任何值,也不需要返回任何值,因为正在修改作为参数传递的数组。

    为什么你的编译器没有产生错误,因为你的两个方法都返回了注释。

    void foo(){
        return;//returns nothing
    }
    
    #include <iostream>
    using namespace std;
    
    void rev(int arr[],int start,int end)
    {
        if(start >= end)
        {
            return;
        }
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        return rev(arr,++start,--end);//doesn't returns any value
    }
    
    void reverse(int arr[],int size)
    {
        rev(arr,0,size-1);
    }
    
    Using rev(arr,++start,--end);
    
    void rev(int arr[],int start,int end)
    {
        if(start >= end)
        {
            return;
        }
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        rev(arr,++start,--end);
    }
    
    void reverse(int arr[],int size)
    {
        rev(arr,0,size-1);
    }
    

    【讨论】:

    • 这个答案虽然事实上是正确的,但并没有回答所提出的问题。考虑重写以解决原始问题。
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2017-12-02
    • 2011-08-26
    • 2020-01-04
    • 2021-06-17
    相关资源
    最近更新 更多