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

时间:2014-04-07 19:32:02

标签: 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);
    }
}

2 个答案:

答案 0 :(得分:0)

您需要做的就是添加一些调试语句以更好地理解它。这是我添加的跟踪它的if语句的结果:

start program
before if, n is = 3
before fun call, n is = 3
before if, n is = 2
before fun call, n is = 2
before if, n is = 1
before fun call, n is = 1
before if, n is = 0
printing = 0
before if, n is = -1
after second fun call, n is = -1
printing = 1
before if, n is = 0
after second fun call, n is = 0
printing = 2
before if, n is = 1
before fun call, n is = 1
before if, n is = 0
printing = 0
before if, n is = -1
after second fun call, n is = -1
after second fun call, n is = 1
end program

答案 1 :(得分:0)

您的问题不是&#34;这是做什么的?&#34; 但是&#34;我如何理解大值的递归函数?&# 34。

递归是解决某些问题的好工具。如果由于某种原因,您必须打印该序列号,上述代码将是解决问题的好方法。递归也用于具有递归结构(如树或列表)或处理递归输入(如解析器)的上下文中。

您可能会看到递归函数的代码并思考&#34;这是做什么的?&#34;但是相反的情况发生的可能性更大:你会发现一个需要通过编写程序来解决的问题。通过经验,您将学习哪些问题需要递归解决方案,并且这是您必须作为程序员开发的技能。

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

使用上面的代码,你不一定需要回答&#34;这段代码给出了什么输出&#34;但相反&#34;它是如何工作的,以及代码遵循的过程&#34;。你可以在纸上做两件事。通过逐步执行算法,您通常可以深入了解它的作用。使这个例子复杂化的一个因素是它不是tail-call recursive。这意味着您必须做更多工作才能理解该程序。

了解&#39;任何你不一定需要能够模拟它并计算输出的程序,这同样适用于此。