c - 如何理解大输入的递归函数调用

标签 c recursion

下面代码的结果是0,1,2,0,每次调用都显式写出来后我就完全明白了。但我想知道是否有更简单的方法来理解递归函数想要实现什么并更快地找到结果?我的意思是,如果 a=1000,我们无法编写所有调用。

#include<stdio.h>
void fun(int);
typedef int (*pf) (int, int);
int proc(pf, int, int);

 int main()
{
int a=3;
fun(a);
return 0;
}
void fun(int n)
{
     if(n > 0)
    {
         fun(--n);
         printf("%d,", n);
         fun(--n);
    }
}

最佳答案

您的问题不是“这有什么作用?”,而是“我如何理解大值的递归函数?”。

递归对于某些类型的问题来说是一个很好的工具。如果由于某种原因,您必须打印该数字序列,则上面的代码将是解决该问题的好方法。递归还用于具有递归结构(如树或列表)或处理递归输入(如解析器)的上下文中。

您可能会看到递归函数的代码并思考“这是做什么的?”但更有可能发生相反的情况:你会发现一个需要通过编写程序来解决的问题。凭借经验,您将学会了解哪些问题需要递归解决方案,这是您作为程序员必须培养的技能。

递归的原理是重复执行一个[通常很简单]的函数。因此,要理解递归函数,您通常只需要了解一个步骤,以及如何重复它。

使用上面的代码,您不一定需要回答“此代码给出什么输出”,而是“它是如何工作的,以及代码遵循什么过程”。您可以在纸上完成这两项工作。通过逐步了解该算法,您通常可以深入了解它的作用。使该示例复杂化的一个因素是它不是 tail-call recursive 。这意味着您必须做更多的工作来理解该程序。

要“理解”任何程序,您不一定需要能够模拟它并计算输出,这同样适用于此处。

关于c - 如何理解大输入的递归函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22921405/

相关文章:

sql-server-2008 - SQL Server 2008 中的递归同表查询

python - 递归 python-JSON 读取器

algorithm - 递归和 DFS 等价吗?

c - 从进程中取消绑定(bind)击键

为缓冲区溢出错误创建测试用例 (C/c++)

java - 是否有更现代的 OO 版本的 "Let' s Build a Compiler”?

memory - Haskell 递归和内存使用

c - 警告 : assignment from incompatible pointer type for a 2D array pointer

c - 在 C 中定义弹性/柔性结构

c - 解析ssv文件