【问题标题】:Is it necessary to put return in a void recursion?是否有必要将 return 放入无效递归中?
【发布时间】:2020-05-17 06:20:09
【问题描述】:

如果问题已经提出,请随意复制这篇文章,我还没有找到与此相同的文章

据我所知,return 不需要在 void 函数中,例如:

void ex () {printf ("Hi\n");}

但是,如果void 递归 中没有return 可以吗?我在想的是,程序将继续调用func (num-1) 直到它到达0 并返回,所以它不会将0 打印到输出,我需要return 在函数的末尾所以递归调用完成后,回到之前的func ()直接调用者。

这是代码,

#include <stdio.h>

void func (int num)
{
    if (!num) return;
    func (num-1);
    printf ("%d\n", num);

    return;             //Is it necessary to put return here?
}

int main ()
{
    func (10);

    return 0;
}

输出,

1
2
3
4
5
6
7
8
9
10

没有最后一个return,它也可以正常工作,还是我错过了什么?

【问题讨论】:

  • 您需要来自ifreturn,因为它是您的停止条件。第二个return 你不需要,因为它不会影响代码。没有return,函数结束并返回给调用者。
  • 所以问题是,是否需要在 void 函数的末尾使用 return 语句?不,这不对; here's 更多细节。
  • @LastSecond959 递归函数和非递归函数的主体编译方式没有区别。返回类型是函数的区别。
  • 有时我像编译器一样工作,不喝咖啡就特别忽略 cmets:P 无论如何,我的 cmets 是关于删除所有返回的,就像其他 cmets 提到的那样,它不需要。
  • @ROOT 哈哈,你不是唯一一个 XD。还是谢谢。

标签: c recursion


【解决方案1】:

返回类型为void 的函数不需要显式的return。只需到达函数的末尾即可正确返回。

同样递归的 void 函数也没有什么不同。函数中的第一个 return 是必需的,因为您希望它在到达函数末尾之前返回,但第二个不是必需的。

【讨论】:

  • 所以你的意思是即使它是一个递归,它会隐式返回到它的直接调用者?虽然需要ifreturn 来防止无限循环,对吗?我说的对吗?
  • 是的。 . . . . . . .
  • 明确一点,即使是显式的return 也只会返回给它的直接调用者。
  • 根本不需要return声明;该函数可以构造为{ if (num) { func(num-1); printf("%d\n", num); } }
  • @Eric Postpischil,是的,这就是我的观点。它独立存在,但人们希望 cmets 提供有关他们发布的答案的反馈。它只是如此随机和毫无意义。充其量,这是多余的,因为我已经提到到达函数的末尾不需要return。我不明白。
【解决方案2】:

返回 void 的函数不必显式返回。一个程序有 1 个入口点,但可能有多个出口点。考虑以下示例:

void print(int var)
{
    if (var)
       return; // first exit point
    /*
     *   do stuff
     */  
    // second exit point
}

它有 2 个出口点。第二个没有return;

【讨论】:

    【解决方案3】:

    试试这个:

    #include <stdio.h>
    
    void func (int num)
    {
        if (!num){ 
         printf("0\n");//print 0 before you stop
         return;
       }
        func (num-1);
        printf ("%d\n", num);
    
    
    }
    
    int main ()
    {
        func (10);
    
        return 0;
    }
    

    【讨论】:

    • 为什么 OP 应该这样做?它究竟是如何解决他们的问题的?
    • 他说它不会在输出中打印 0
    • @Escanor 谢谢,但这不是我的问题。我在问不把return放在无效递归的末尾是否可以。
    • s/(!num)/(num == -1)/ ?
    • @Escanor,我相信 OP 说它使用 return,因为它应该在打印 0 之前停止。
    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多