解释所需的C递归

时间:2014-04-17 15:00:55

标签: c recursion

我需要一些有关此特定代码的帮助。我并没有真正理解它。有人可以花点时间向我解释一下吗?它所做的就是用一个字来打印出它的反面。我不理解递归部分,但是对于n = 1,for循环只运行一次,递归将运行直到它读取整个单词并且它符合''标记,但是它如何打印出反转字?

 void reverse()
 {
   char c;
   scanf("%c", &c);
   if (c!=' ')
       {
        reverse();
       }
 printf("%c", c);
 }


 int main()
 {
 int n, i;
 printf("\nThe number of the words=");
 scanf("%d", &n);

 for(i=1; i<=n; ++i)
   {
    reverse();
    printf("\n");
   }

 printf("\nEnd of the program.\n");
 return 0;
 }

2 个答案:

答案 0 :(得分:2)

注意 您的示例位于底部,首先是您的标题问题:解释所需的C递归

递归 是一种编程技术,允许操作自行调用。
一个简单(但毫无意义)的例子是:

void call(void);
int main(void)
{
    call();
}

void call(void)
{
    call(); 
}   

注意:这只会直到堆栈确定有太多的呼叫堆积起来,并使程序崩溃。

一个更有意义的例子 (用于说明)就是写一个回文字符系列(A - Z):

void Palindrome(char a)
{
    char b[2];
    sprintf(b, "%c", a);
    printf(b);
    if((a >= 65)&&(a < 90))
    {
        Palindrome(a+1);
    }
    sprintf(b, "%c", a);
    printf(b);
}  

这最后一个例子实际上做了第一个例子没有做的两件重要事情:
1) 具有受控的退出条件 if((a&gt; = 65)&amp;&amp;(a&lt; = 90)) <登记/> 2) 使用先前调用的结果和后续调用。

在您的示例中 : 程序工作的原因是每次操作调用自身时,它会更深地嵌套(每个调用一个嵌套)到该部分:(对于所有递归程序都是如此)

  {
    reverse();
  }  

概念类似于:

{
    //do something
    {
        //do something
        {
            //do something
            //... and so on for as many recursions are necessary to meet exit criteria
        }
    }
}

“......但是,它如何打印掉反转的字?”
只有在递归到达编程限制之后,执行才会向下流过结束}并点击下一部分,继续自行展开,每次访问时, 按堆栈的相反顺序,< / em> c的值,直到每个嵌套级别被解开:

     }  //after exit criteria is met, execution flow goes from here....
     printf("%c", c); //prints values of c in reverse order.
 } //to here until number of recursions is exhausted.

那时,如果您逐步使用调试器,每次都会看到流程从上部}到下部}执行printf()

答案 1 :(得分:0)

确实有点难以获得;递归反转通过递归从输入中获取越来越多的字符直到输入一些终端符号' '为止。输入隐式存储在堆栈中,直到在reverse的每次递归调用终止时打印。

请注意,字符仅打印到输出中,但它们不会存储在任何位置以供以后访问;一旦reverse的第一次呼叫终止,就无法再次获得它们。