哈哈哈的 发表于 2019-2-15 17:02:58

这个递归调用没有看懂耶

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


输出的结果是654321。。关于那个f函数,我只看懂了,输出x,也就是把1输出来了。其余的65432不知道怎么来的,,有点迷茫。 能不能仔细地讲一讲??谢谢!!

910201513 发表于 2019-2-15 19:39:13

已解决是看懂了的意思吗?需要帮助吗?

jackz007 发表于 2019-2-15 20:40:41

本帖最后由 jackz007 于 2019-2-15 20:56 编辑

      把递归函数 f(const int x[] , const int n) 中的数组 x[] 改成指针也许比较容易说明问题:
#include <stdio.h>

void f(const int * x , const int n)
{
      if(n > 1) {
                f(x + 1 , n - 1)    ;
                printf(" %d" , * x) ;
      } else {
                printf("%d" , * x);
      }
}

main(void)
{
      int z = {1 , 2 , 3 , 4 , 5 , 6} ;
      f(z , 6)                           ;
      printf("\n")                     ;
}


      函数 f() 每次递归调用传进去的参数都有变化,其中,x 会指向后一个元素,n 会减 1,直到 n = 1 终止递归。

      第 1 次调用 x = 1 , n = 6- 继续递归
      第 2 次调用 x = 2 , n = 5- 继续递归
      第 3 次调用 x = 3 , n = 4- 继续递归
      第 4 次调用 x = 4 , n = 3- 继续递归
      第 5 次调用 x = 5 , n = 2- 继续递归
      第 6 次调用 x = 6 , n = 1- 终止递归

      n = 1 终止递归,首先输出数组 x[] 的第 6 个元素 6,然后递归函数继续按照 n = 2、3、4、5、6 的顺序依次逐级返回,于是,又先后陆续输出后面的 5、4、3、2、1

哈哈哈的 发表于 2019-2-15 21:30:19

jackz007 发表于 2019-2-15 20:40
把递归函数 f(const int x[] , const int n) 中的数组 x[] 改成指针也许比较容易说明问题:




原程序中的f(&x,n-1)我可能没看懂... 我以为这就是传了x的地址,而你说这是使x指向后一个元素。。我有点不理解

jackz007 发表于 2019-2-15 21:51:32

本帖最后由 jackz007 于 2019-2-15 21:57 编辑

哈哈哈的 发表于 2019-2-15 21:30
原程序中的f(&x,n-1)我可能没看懂... 我以为这就是传了x的地址,而你说这是使x指向后一个元素。。 ...

      你理解的没错,& x 确实是取 x 的地址,但并非主函数中数组元素 z 的地址。也就是说,每次递归时,用 & x 表达的数组首地址是不断变化的。

      递归过程如果用原数组 z[] 来表达会更容易理解:
      f(& z , 6) ;
      f(& z , 5) ;
      f(& z , 4) ;
      f(& z , 3) ;
      f(& z , 2) ;   
      f(& z , 1) ;
   
页: [1]
查看完整版本: 这个递归调用没有看懂耶