Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何理解大型输入的递归函数调用_C_Recursion - Fatal编程技术网

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

C 如何理解大型输入的递归函数调用,c,recursion,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)

下面代码的结果是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);
    }
}
#包括
虚无乐趣(int);
typedef int(*pf)(int,int);
int proc(pf,int,int);
int main()
{
INTA=3;
乐趣(a);
返回0;
}
虚无乐趣(int n)
{
如果(n>0)
{
乐趣(--n);
printf(“%d”,n);
乐趣(--n);
}
}

您需要做的就是添加一些调试语句,以便更好地理解它。这是我添加的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
你的问题不是“这能做什么?”而是“我如何理解大值的递归函数?”

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

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

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

对于上面的代码,您不必回答“此代码提供了什么输出”,而是回答“它是如何工作的,代码遵循什么过程”。你可以在纸上做这两件事。通过逐步了解算法,您通常可以了解它的功能。使这个例子复杂化的一个因素是它不是。这意味着你必须做更多的工作来理解这个程序


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

逐步了解它。。试着在前后打印
n
。@staticx我知道我们可以一步一步地通过它找到结果,但是如果数字太大而我们无法通过它怎么办?a=1000?我们可以在电脑上测试它,但如果是在面试中呢?看起来是这样。我怀疑你会得到一千个元素来检查,但如果你不得不这样做,如果你能够明智地解释代码,我相信面试官会让你休息一下,而不是让你经历一千次。