WAngLeYu 发表于 2023-3-28 12:31:12

关于函数嵌套和递归的问题 有人可以解答一下这个代码吗

#include<stdio.h>
int f(int a[],int n)
{
        if (n>1) return a+f(&a,n-1);
        else return a;
}
int main()
{
        int aa={1,2,3,},s;
        s=f(&aa,3);
        printf("%d\n",s);
        return 0;
}

WAngLeYu 发表于 2023-3-28 12:32:32

程序运行结果是6 疑惑点在于如何返回的

isdkz 发表于 2023-3-28 12:36:29

本帖最后由 isdkz 于 2023-3-28 12:37 编辑

这是一个使用C语言编写的程序,它通过递归的方式计算整数数组的总和。首先,让我们了解一下代码的各个部分:


[*]包含头文件 #include<stdio.h>:这个头文件包含了输入/输出函数如printf等。

[*]int f(int a[],int n):这是一个名为f的自定义函数,它接受两个参数,一个整数数组a[]和一个整数n。这个函数用于计算数组的总和。

[*]函数f的实现:
[*]if (n>1) return a+f(&a,n-1);:如果n大于1,函数会返回a(数组中的第一个元素)加上函数f的递归调用结果。递归调用传递给函数的参数是数组的第二个元素的地址(即从第二个元素开始的子数组)和n减1。
[*]else return a;:如果n等于1,函数直接返回数组的第一个元素。


[*]int main():程序的主函数,从这里开始执行。

[*]int aa={1,2,3,};:定义并初始化一个含有3个整数的数组aa,元素为1、2和3。

[*]s=f(&aa,3);:调用函数f,传递数组aa的第一个元素的地址和数组的长度3,将计算结果存储在整数变量s中。

[*]printf("%d\n",s);:打印计算结果s。

[*]return 0;:主函数返回0,表示程序正常结束。


在这个程序中,函数f通过递归调用来计算整数数组的总和。在每次递归调用中,n减1,直到n等于1时返回数组中的最后一个元素。这个过程相当于一个嵌套的求和操作。

输出结果为:

6

这是因为数组aa的元素之和为1+2+3=6。

myd0311 发表于 2023-3-28 13:11:29

本帖最后由 myd0311 于 2023-3-28 13:13 编辑

#include<stdio.h>
int f(int a[],int n)
{
      if (n>1) return a+f(&a,n-1);
      else return a;
}
int main()
{
      int aa={1,2,3,},s;
      s=f(&aa,3);
      printf("%d\n",s);
      return 0;
}
不能像楼上说的那么仔细,但是我们可以模拟一下:

第 0 层(f),此时参数 a 为 {1, 2, 3},n = 3,计算 f(&a,n-1) 的值
第 1 层(f),此时参数 a 为 {2, 3},n = 2,计算 f(&a,n-1) 的值
第 2 层(f),此时参数 a 为 {3},n = 1,n > 1 不成立,返回 3
第 1 层(f),f(&a,n-1)已返回为 3,+ a(2) 就是 5
第 0 层(f),f(&a,n-1)已返回为 5,+ a(1) 就是 6
返回 main,复制给 s,输出

myd0311 发表于 2023-3-28 13:14:10

每一层的 a 数组都不一样,因为每一次的数组开始都是从 a 开始的,相当于下一次传递的参数把 a 吃掉了,就从下一个元素开始了
页: [1]
查看完整版本: 关于函数嵌套和递归的问题 有人可以解答一下这个代码吗