在C中手动获取递归的输出

akk*_*kki 0 c recursion

所以,我有两个问题.

问题1)我发现C中的递归很困难.我有一个问题,我不知道我该怎么做才能尝试.我想知道它的输出,请帮帮我.

#include <stdio.h>
void fun (int);
int main (void)
{
   int a;
   a = 3;
   fun(a);
   printf("\n");
   return 0;
}

void fun ( int n )
{
  if ( n > 0 )
  {
     fun(--n);
     printf("%d",n);
     fun(--n);
  }
}
Run Code Online (Sandbox Code Playgroud)

如何手动解决此递归?我知道在递归期间,信息存储在堆栈中.因此,我尝试这样做.首先,a将一直递减到0.然后,它将退出循环.那么,何时会打印出值?

问题2)此外,我想知道,因为我现在正在研究的主题是功能.如果我创建一个函数并让它假设它返回一些值,那么我是在调用时收集它的值还是我可以在不收集其返回值的情况下调用它的IS IT MANDATORY?

例如:假设我将函数设为,

int foo ( int a )
{ 
   ........
   return b;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我从main内部调用此函数,那么我是否必须将返回的值存储在某个变量中?

Ant*_*ala 7

你有两个问题:第一个是你的代码中发生的事情:

对于你的问题#1:fun(n)可以重写函数,使其在功能上等同但更容易理解,如:

void fun(n) {
   if (n > 0) { 
      fun(n - 1);
      printf("%d", n - 1);
      fun(n - 2);
   }
}
Run Code Online (Sandbox Code Playgroud)

那是:

for fun(n)
    if n > 0,
        first call fun(n - 1)
        then print the number n - 1
        lastly call fun(n - 2)
Run Code Online (Sandbox Code Playgroud)

因此,在展开递归时会发生以下情况:

fun(3) ->
    fun(2) ->
        fun(1) ->
              fun(0) ->
                  n <= 0 -> exits
              prints 0
              fun(-1) ->
                  n <= 0 - exits
        prints 1
        fun(0) ->
            n <= 0 - exits
    prints 2
    fun(1) ->
        fun(0) ->
            exits as n <= 0
        prints 0
        fun(-1) ->
            exits as n <= 0
Run Code Online (Sandbox Code Playgroud)

执行顺序从上到下 - 因此0120来自prints行的输出.

问题2:

不,返回值不需要存储在变量中.实际上,printf您使用的返回an int表示写入的字符数,但您没有将该返回值存储在任何位置.