鱼C论坛

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

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

[复制链接]
发表于 2023-3-28 12:31:12 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
int f(int a[],int n)
{
        if (n>1) return a[0]+f(&a[1],n-1);
        else return a[0];
}
int main()
{
        int aa[3]={1,2,3,},s;
        s=f(&aa[0],3);
        printf("%d\n",s);
        return 0;
}
最佳答案
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[0]+f(&a[1],n-1);:如果n大于1,函数会返回a[0](数组中的第一个元素)加上函数f的递归调用结果。递归调用传递给函数的参数是数组的第二个元素的地址(即从第二个元素开始的子数组)和n减1。
    • else return a[0];:如果n等于1,函数直接返回数组的第一个元素。

  • int main():程序的主函数,从这里开始执行。
  • int aa[3]={1,2,3,};:定义并初始化一个含有3个整数的数组aa,元素为1、2和3。
  • s=f(&aa[0],3);:调用函数f,传递数组aa的第一个元素的地址和数组的长度3,将计算结果存储在整数变量s中。
  • printf("%d\n",s);:打印计算结果s。
  • return 0;:主函数返回0,表示程序正常结束。


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

输出结果为:
6

这是因为数组aa的元素之和为1+2+3=6。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-28 12:32:32 | 显示全部楼层
程序运行结果是6 疑惑点在于如何返回的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

  • int main():程序的主函数,从这里开始执行。
  • int aa[3]={1,2,3,};:定义并初始化一个含有3个整数的数组aa,元素为1、2和3。
  • s=f(&aa[0],3);:调用函数f,传递数组aa的第一个元素的地址和数组的长度3,将计算结果存储在整数变量s中。
  • printf("%d\n",s);:打印计算结果s。
  • return 0;:主函数返回0,表示程序正常结束。


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

输出结果为:
6

这是因为数组aa的元素之和为1+2+3=6。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0]+f(&a[1],n-1);
        else return a[0];
}
int main()
{
        int aa[3]={1,2,3,},s;
        s=f(&aa[0],3);
        printf("%d\n",s);
        return 0;
}
不能像楼上说的那么仔细,但是我们可以模拟一下:

第 0 层(f),此时参数 a 为 {1, 2, 3},n = 3,计算 f(&a[1],n-1) 的值
第 1 层(f),此时参数 a 为 {2, 3},n = 2,计算 f(&a[1],n-1) 的值
第 2 层(f),此时参数 a 为 {3},n = 1,n > 1 不成立,返回 3
第 1 层(f),f(&a[1],n-1)已返回为 3,+ a[0](2) 就是 5
第 0 层(f),f(&a[1],n-1)已返回为 5,+ a[0](1) 就是 6
返回 main,复制给 s,输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-28 13:14:10 | 显示全部楼层
每一层的 a 数组都不一样,因为每一次的数组开始都是从 a[1] 开始的,相当于下一次传递的参数把 a[1] 吃掉了,就从下一个元素开始了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-26 14:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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