一、递归函数的条件
1.递归的次数是有限的;
2.每次递归后都要接近这个条件;
二、如何实现求Sn的和(函数创建)
1)、考虑形参有几个:(下面以我设的变量为例)
首先想到的就是需要有Sn中的前n项作为变量,则需要一个int n来表示n项和,以及上述问题中的数字a,设一个int a表示数字;那么考虑到这我们可以先初略尝试一下编辑函数,如下:
由于递归的条件,想到了设置y和y++来实现,当y==n就会结束递归;但是如果单纯就是int y的话,y就属于自动存储期的变量,每次调用Sn这个函数 y 都会重新赋值为 0 ;因此可以用static将y变成静态存储期,不会static的也可以查找下面网站或者抖音搜索比特鹏哥的视频:c语言static是什么意思 • Worktile社区c语言static意思是静态变量。static指修饰符,可以用来修饰变量,也可以用来修饰函数。如果是在函数外面定义的,那么static说明的变量可以在当前c程序文件中使用。如果是在函数内部定义的,那么这个变量只初始化一次,即使再次调用这个函数,这个static变量也不会再次被初始化。 一、 static概述 Stati...https://worktile.com/kb/ask/19274.html(4.33 YzG:/ 06/13 v@s.Eh 《鹏哥C语言第一课》第70.1讲 C语言static的作用:修饰局部变量(1)# c语言 # 计算机 # 鹏哥C语言 # c语言程序设计 # 计算机大学生 https://v.douyin.com/iLuAsmwU/ 复制此链接,打开Dou音搜索,直接观看视频!)
2)、完善函数的漏洞:
对于该函数但是是否可行呢???我通过运行发现出现了BUG!!!想到了调试,通过调试发现,问题出现在a*10+a这个地方,接下来,以题目2为例,表示的数是2*10+2,,,(2*10+2)*10以此类推;以递归一次为例:
这里画出红线部分明显不符合要求了,因此我想到可以设置一个变量b来存储元素a = 2的值;由此产生下面的函数:
这里我用到的const修饰b的值,相当于锁死了 b = 2,通过运行发现结果是正确的;
关于const:
三、完整的代码:
int sn(int a,int n,const int b)//a表示sn数列中的数字,n表示前几项和,b来接收a的值并固定,保证不会发生改变
{
static int y = 0;//通过static修饰y,将y变成静态存储期;
if (y==n)
{
return 0;//递归的限制条件
}
y++;
return sn(a * 10 + b,n,b)+a;//因为a实在变的而我们需要加的是最开始的数字,所以用b来保存第一次的a;
}
int main()
{
int a;
int n;
scanf("%d", &a);
int b = a;//将数字a保存到b中;
printf("求a的前几项和:");
scanf("%d", &n);
printf("%d",sn(a, n,a));
return 0;
}