2015-07-20 136 views
0

我想了解下面的程序,其中递归函数调用存在,但越来越困惑,而跟踪如何加载大头钉。难以理解连续递归调用

void func(char*); // function prototype 

int main(){ 
    func("123"); 
    return 0; 
} 

void func(char a[]){ 
    if(a[1]=='\0') 
     return; 
    func(a+1); 
    func(a+1); 
    printf("%c",a[1]); 
} 

的输出,这是3 3 2

希望如果有人能在这一个建议......

做这种多次递归调用以任何方式有益的或发现的应用具体问题领域..?

+2

这是最经常使用的例如用于递归(未的网站,但Fibonacci数计算)::http://www.programmingsimplified.com/c-program执行NTF陈述可以通过这个公式获得-generate-fibonacci-series – RhinoDevel

+0

的确,我使用斐波那契计算作为一个面试问题,要求候选人创建一个迭代和递归的解决方案。 –

回答

1

使用断点调试是了解递归的一种方法。另一种方法是绘制递归调用树。

Recursive calls tree

从图中,在0级后,每一级,每两个节点由于的这两行代码后发生的printf语句:

func(a+1); 
func(a+1); 

在一般情况下,这将成为一个完美的二进制树的长度大于0的任何输入字符串。节点的总数由以下公式给出:

2^(k+1) - 1 // k is the depth; here k = 2 

pri

2^k - 1 // For k=2, there will be 3 printf statements each printing 3,3,2 respectively 
2

只需将自己置于CPU的位置并逐行执行(或使用调试器来完成该任务)。

第一呼叫是

func("123") 

此呼叫不满足终止条件a[1] == '\0',所以它调用

func("23"); 

以进而FUNC( “23”)的呼叫调用

func("3") 

哪些能满足退货条件。所以,该调用返回到前一个调用者func(“23”)。

FUNC(“23”)进行拨打另一个电话,以FUNC(“3”)由于线路

func(a+1); 
func(a+1); 

继续在你的头脑执行程序的过程中,并写下来会是什么每次致电printf。这将解释你的输出。

UPDATE

注意,调用printf()发生递归调用,所以如到

FUNC( “123”)的调用

会继续像

  • 输入FUNC( “123”)
  • 终止条件没有得到满足
  • 呼叫FUNC( “23”)
  • 呼叫FUNC( “23”)再次
  • printf的( “3”)(其为[1])
  • 返回
+0

感谢@Eric,以及如何将printf函数调用与调用func()..相关联? –

+1

对于每次调用func(),只要func()的参数由于if(a [1] =='\ 0')返回而超过一个字符长度,printf()将最终被调用; 。棘手的部分是在两次调用func(a + 1)后调用printf()*。这真的归结为“玩CPU”,并逐步完成。这可能有助于在纸上打印出来,并使用铅笔逐行进行打印。如果您使用铅笔,请记下每个电话的func()参数以帮助您保持跟踪。 –

1

发布的代码是一个相当差的递归实例。

以下代码具有正确的“尾”形式的递归。

将反转的字符串传回给main并让main打印它可能会更好。

它颠倒的字符串传递给FUNC()由订单的main()

请询问运行时的问题,邮编编译,包括头文件所需的#includes时候,所以我们不猜测其标头包括

#include <stdio.h> 

void func(char*); // function prototype 

int main(){ 
    func("123"); 
    return 0; 
} 

void func(char a[]) 
{ 
    if(a[1]=='\0') // check for end of recursive sequence 
    { 
     printf("%c", a[0]); // last tail action 
     return; 
    } 

    func(a+1); // step+next recursion 
    printf("%c", a[0]); // tail action 
    return; 
} 
0

递归可以简单地理解如下。

例如:

Func(int a){ 
    while(a>1) 
     return a * func(a-1); 
} 

假设a = 5

会发生什么,它返回5 * func(4)

现在func(4)返回4 * func(3)它会继续如此。

结账this example for use of recursion in fibonacci series