递归在这里是如何工作的?(下面的代码) #包括 无效函数(整数x) { 如果(x==0) 返回; 其他的 { func(--x); printf(“%d\t”,x); } } void main() { int k=2; func(k); }

递归在这里是如何工作的?(下面的代码) #包括 无效函数(整数x) { 如果(x==0) 返回; 其他的 { func(--x); printf(“%d\t”,x); } } void main() { int k=2; func(k); },c,function,recursion,C,Function,Recursion,输出:01 为什么输出不是0 1 2 第一次调用函数时,x的值等于2。 然后它也应该在最后打印出来。我对这个代码感到困惑。 有人能帮我吗?您只需在printf之后交换递归调用即可 #include<stdio.h> void func(int x) { if (x==0) return; else { func(--x); printf("%d\t",x); } } void main() { int k=2;

输出:
01

为什么输出不是
0 1 2

第一次调用函数时,
x
的值等于2。 然后它也应该在最后打印出来。我对这个代码感到困惑。
有人能帮我吗?

您只需在printf之后交换递归调用即可

#include<stdio.h>
void func(int x)
{
   if (x==0)
      return;
   else
   {
      func(--x);   
      printf("%d\t",x);
   }
}
void main()
{
    int k=2;
    func(k);
}
#包括
无效函数(整数x){
如果(x==0){printf(“%d\t”,x);
返回;}
否则{
func(--x);
printf(“%d\t”,x+1);
}
}
int main(){
int k=2;
func(k);
}

--x
减小x的值,然后在打印之前执行此操作;这就是为什么输出是
0 1
而不是
0 1 2

在这里,
x
的第一个值减小,每次都推到堆栈上,直到x==0,然后,最终结果以与初始递归函数调用完全相反的顺序累积。

对于初学者来说,将参数声明为具有类型
unsigned int
更为正确。否则,使用负值减小参数可能会导致很长的输出序列

在函数的每次递归调用中,参数首先减小,减小后打印输出

#include<stdio.h>
void func(int x){
if(x==0){printf("%d\t",x);
return;}
else{
     func(--x);   
     printf("%d\t",x+1);
    }
  }
int main(){
    int k=2;
    func(k);
}
因此,如果最初调用函数时参数等于
2
,那么它会输出值
1
,因为参数减少了

因此

只有最里面的函数调用首先输出其值

如果您希望这样,输出将如下所示

func( 2 ) --> outputs 1
func( 1 ) --> outputs 0
func( 0 ) --> outputs nothing
然后,该函数的定义应与本演示程序中所示的相同

0 1 2
该函数与原始函数的不同之处在于,参数本身在函数调用中没有减少。它保持其价值不变

0   1   2

如果递归调用发生在方法的开头,则称为头递归。该方法会在跳转到下一个递归调用之前保存状态。

听起来您可能需要学习如何使用调试器逐步完成代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它偏离预期的地方。这是一个必要的工具,如果你要做任何编程。进一步阅读:行'if(x==0)return;`再清楚不过了。如果
x
0
,则不要执行此函数的其余部分。作为下一个练习-交换
printf
func
行。然后去读关于头部递归和尾部递归的文章。@FrançoisAndrieux我想问的是它应该打印0 1 2。我之所以强调2,是因为它属于最后一条激活记录,从技术上讲,它应该打印2,但它不是这样做的。@SatyendraYadav在减量
I
后打印。请尝试
func(i-1)
。它是如何回答问题的?请解释更多。如果您先打印f,然后调用,您将获得正确的输出。这也会颠倒输出顺序。注意,我的错,我现在将修复此问题
#include <stdio.h>

void func( unsigned int x )
{
    if ( x ) func( x - 1 );   
    printf( "%u\t", x );
}

int main(void) 
{
    func( 2 );
    putchar( '\n' );
}   
0   1   2
if ( x ) func( x - 1 );   
               ^^^^^^ the variable x itself is not changed