鱼C论坛

 找回密码
 立即注册
查看: 1493|回复: 4

[已解决]这个递归调用没有看懂耶

[复制链接]
发表于 2019-2-15 17:02:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


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

最佳答案
2019-2-15 21:51:32
本帖最后由 jackz007 于 2019-2-15 21:57 编辑
哈哈哈的 发表于 2019-2-15 21:30
原程序中的f(&x[1],n-1)我可能没看懂... 我以为这就是传了x[1]的地址,而你说这是使x指向后一个元素。。 ...


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

      递归过程如果用原数组 z[] 来表达会更容易理解:
      f(& z[0] , 6) ;
      f(& z[1] , 5) ;
      f(& z[2] , 4) ;
      f(& z[3] , 3) ;
      f(& z[4] , 2) ;   
      f(& z[5] , 1) ;
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-15 19:39:13 | 显示全部楼层
已解决是看懂了的意思吗?需要帮助吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-15 20:40:41 | 显示全部楼层
本帖最后由 jackz007 于 2019-2-15 20:56 编辑

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

  2. void f(const int * x , const int n)
  3. {
  4.         if(n > 1) {
  5.                 f(x + 1 , n - 1)    ;
  6.                 printf(" %d" , * x) ;
  7.         } else {
  8.                 printf("%d" , * x)  ;
  9.         }
  10. }

  11. main(void)
  12. {
  13.         int z[6] = {1 , 2 , 3 , 4 , 5 , 6} ;
  14.         f(z , 6)                           ;
  15.         printf("\n")                       ;
  16. }
复制代码


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

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

        n = 1 终止递归,首先输出数组 x[] 的第 6 个元素 6,然后递归函数继续按照 n = 2、3、4、5、6 的顺序依次逐级返回,于是,又先后陆续输出后面的 5、4、3、2、1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-15 21:30:19 | 显示全部楼层
jackz007 发表于 2019-2-15 20:40
把递归函数 f(const int x[] , const int n) 中的数组 x[] 改成指针也许比较容易说明问题:

原程序中的f(&x[1],n-1)我可能没看懂... 我以为这就是传了x[1]的地址,而你说这是使x指向后一个元素。。我有点不理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-15 21:51:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-2-15 21:57 编辑
哈哈哈的 发表于 2019-2-15 21:30
原程序中的f(&x[1],n-1)我可能没看懂... 我以为这就是传了x[1]的地址,而你说这是使x指向后一个元素。。 ...


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

      递归过程如果用原数组 z[] 来表达会更容易理解:
      f(& z[0] , 6) ;
      f(& z[1] , 5) ;
      f(& z[2] , 4) ;
      f(& z[3] , 3) ;
      f(& z[4] , 2) ;   
      f(& z[5] , 1) ;
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 22:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表