为什么输出的会是654321


#include<stdio.h>
void   f(int  x[],int  n-1)
{
if(n>1)
{
f(&x[1],n-1);
printf("%d,",x[0]);
}
else    printf("%d,",x[0]);
}
main()
{
int  z[6]={1,2,3,4,5,6};
f(z,6);
primtf("/n");
}

递归,我们一步步来看:

  • 首先 你这函数定义有问题 ,参考评论完整修改

详细分析如下:

  • 首先 f(z, 6) 压入栈;
  • 进入f(z, 6),即 f(x, 6), n = 6, n > 1 , 进入 f(&x[1], 5) 压入栈 , 这里是把 x[1] 所在地址传入;
  • 进入 f(&x[1], 5), n = 5, n > 1成立, 进入 f(&x[2], 4) 压入栈, 这里是把 &x[1] 作为首地址的数组,取对应的第二个元素的地址,也就是 &x[2];
  • 进入 f(&x[2], 4),n = 4, n > 1成立, 进入 f(&x[3], 3) 压入栈,这里是把 &x[2] 作为首地址的数组,取对应的第二个元素的地址,也就是 &x[3];
  • 进入 f(&x[3], 3),n = 3, n > 1成立, 进入 f(&x[4], 2) 压入栈,这里是把 &x[3] 作为首地址的数组,取对应的第二个元素的地址,也就是 &x[4];
  • 进入 f(&x[4], 2), n = 2, n > 1成立, 进入 f(&x[5], 1) 压入栈,这里是把 &x[4] 作为首地址的数组,取对应的第二个元素的地址,也就是 &x[5];
  • 进入 f(&x[5], 1), n = 1, n > 1 不成立,打印 x[5]元素,f(&x[5], 1) 出栈返回。
  • 继续 f(&x[4], 2) 中,打印 x[4]元素,f(&x[4], 2) 出栈返回。
  • 继续 f(&x[3], 3) 中,打印 x[3]元素,f(&x[3], 3) 出栈返回。
  • 继续 f(&x[2], 4) 中,打印 x[2]元素,f(&x[2], 4) 出栈返回。
  • 继续 f(&x[1], 5) 中,打印 x[1]元素,f(&x[1], 5) 出栈返回。
  • 继续 f(z, 6)中,打印 x[0] 元素,f(z, 6) 出栈返回到 主函数。
  • 最终打印 6 5 4 3 2 1

这能输出?f函数的形参表不对啊

因为这是递归,且递归在前,然后才是输出。那么函数会先一直递归到最底层,也就是数组的最后一个元素,然后递归结束,开始输出,从最底层开始输出,因此先输出6,再回退输出5,4,3,2,1
递归利用了堆栈,先进后出