递归函数如何返回一些东西?

Posted

技术标签:

【中文标题】递归函数如何返回一些东西?【英文标题】:How come recursive functions return something? 【发布时间】:2016-09-25 06:31:07 【问题描述】:

我看到了一个c语言的递归函数示例。

#include <stdio.h>
int sum(int n);
int main()
    int num,add;
    printf("Enter a positive integer:\n");
    scanf("%d",&num);
    add=sum(num);
    printf("sum=%d",add);

int sum(int n)
    if(n==0)
       return n;
    else
       return n+sum(n-1);    /*self call  to function sum() */

但在这里我无法理解 sum 函数实际上只返回从代码中可见的 0,否则它将返回自身加上 ​​n

那么函数调用是如何被转换为数字的,函数中没有任何行告诉返回 n 本身,除了它是 0 。

【问题讨论】:

非常好的问题 +1 开始。我想知道答案。 按照逻辑就行了。如果n 是0,那么它当然会返回0。如果n 是1 怎么办?然后它返回1 + sum(0)。好吧,sum(0) 是 0。所以 1 + sum(0) 是 1。明白了吗?同理,sum(2) 为 3,sum(3) 为 6,以此类推 查找“基本情况”,它将帮助你,当它返回 0 时,它是递归的基本情况 这里的问题是这个函数只允许返回0它如何返回其他东西 一个更好的问题可能是:为什么要为如此简单的事情编写如此不必要的缓慢且效率低下的函数?这是非常糟糕的编程。请不要研究如何进行非常糟糕的编程。 【参考方案1】:

如果您观察 sum() 函数 - 它的返回类型为 int。 这意味着当我们从这个函数返回时 - 返回值将是一个整数。

现在这里的语句是任何递归例程的关键:

return n + sum(n-1);

在这里,我们再次为 (n-1) 调用 sum(),它应该返回一个整数。在从这个函数返回之前 - 我们将只添加 'n' 并从这里返回一个整数。

这个递归例程可以被认为是:

sum(3) = 3 + sum(2) = 3 + 2 + sum(1) = 3 + 2 + 1 + sum(0)

最终等于:3+2+1+0

【讨论】:

仍然没有意义这个函数返回一个数字加上一个返回类型为 num 但本身是一个函数的函数 现在我开始明白了,但这不是一种糟糕的循环方式吗?会有成千上万的函数调用大数字总是只返回 1 谁想要这样做而不是这个,一个基本的循环可以处理这么高效的@pankaj,有什么理由让人们想要使用它而不是循环? @nikoss 在这个例子中,你是对的,这是实现这个特定功能的一种糟糕的方式。从这个意义上说,它是递归解决方案的糟糕候选者。然而,对于其他问题,递归是自然而有效的。 请阅读有关递归例程和一些示例用法的信息。正如@nikoss 所说,对于这个特定用例来说,这是一种糟糕的方式,但请考虑阅读有关河内塔问题的信息 - en.wikipedia.org/wiki/Tower_of_Hanoi 另外,要理解递归的概念,请阅读函数调用栈-en.wikipedia.org/wiki/Call_stack【参考方案2】:

在下面的函数中,

int sum(int n)
    if(n==0)
       return n;
    else
       return n+sum(n-1);    /* sum() returns int so its n+(returned int) */

它返回一个int

else 部分调用一个函数,该函数又返回一个 int,然后它执行添加并返回最终值。

sum(1) => 1+sum(0) => 1+0 => 1
sum(2) => 2+sum(1) => 2+(1+sum(0)) => 2+(1+0) => 2+(1) => 3
...

你也可以写成-

sum(3) =&gt; 3+sum(2) =&gt; 6

sum(3) => 3+sum(2+sum(1+sum(0))) => 6

【讨论】:

【参考方案3】:

作为对所有这些好的解释的补充,我准备了一个递归树来帮助您理解递归的示意图。如果我们以sum(3) 为开始

         sum(3)
      _____|_____
      |         |
      1    +  sum(2)
             ___|___
             |     |
             1  + sum(1)
                ___|___
                |     |
                1  +  0 => base part (if condition came true)

请注意,所有模式都将一直等待,直到函数获取基础部分。在某种程度上,层次结构从上到下变得更加具体,直到找到答案;然后它将开始从下到上关闭所有树枝。

【讨论】:

这是有道理的,但是谁想使用这种方式而不是循环一个大数字意味着成千上万的函数调用只是为了返回 1 总是@taha 这不是愚蠢吗? 当然是,对于这个例子。这棵树只是为了解释'递归逻辑'。但在某些问题中,为了提高效率和复杂性,确实需要使用递归:cquestions.com/2008/01/c-program-for-binary-search-through.html.

以上是关于递归函数如何返回一些东西?的主要内容,如果未能解决你的问题,请参考以下文章

关于从递归函数返回正确的东西的问题(Leetcode 572)

为啥我们需要在这个递归函数中返回

数组中的filter函数,递归以及一些应用。

如何在不停止递归的情况下返回递归函数中的值?

PHPUnit 是不是有一些内置的递归数组比较函数?

这个递归函数如何中断并返回[重复]