006-函数递归,内联,变参,声明
练习:
要求自定义一个函数,用来比较两个数字的大小,返回较大的数字
要求自定义一个函数,用来求取输入数字中的最大值
函数嵌套:
函数与函数之间相互进行调用;
递归函数:
特殊的嵌套函数
特殊在递归函数是自己调用自己
即是函数A的函数体重又一次调用了函数A自己
函数A调用了函数B,函数B中又调用了函数A,两者属于递归吗?
属于递归
每一次调用函数,进行递归时,系统会不会为新的调用函数分配空间??
会
每一次调用函数,进行递归时,上一次递归时系统为函数分配的空间会被释放吗??
不会
如果递归函数没有一个终止条件,会怎么样?
没有一个终止条件,递归将永远持续下去,没有尽头
每一次进行递归函数调用,系统都会为新的函数分配空间
而没有尽头的递归是无法停止的,所以最终堆栈空间将不够使用,导致爆炸
结论就是:
为了保证递归函数的正常执行,或者说函数的正常执行;
递归函数必须有一个终止条件;
练习:
使用递归的方式,实现求取10!
10!
=9! * 10
=8! * 9
=7! * 8
...
=2! * 3
=1! * 2
=1
内联函数:
inline
是函数的运行速率更快
因为省略了函数调用是的分配,和函数运行结束的回收
生效过程是编译过程
格式:
在正常的函数定义前,添加关键字inline
声明其为内联函数
inline int func(int x)
{
...
}
变参函数:
函数参数个数不定,需根据实际意义,或者已出现的相关参数进行添加
int printf(const char *format, …);
只定义了第一个参数,省略号表示后面还有不定个数的参数
注意:
C语言的两个基本规则
先定义,后使用 变量
先声明,后使用 函数
函数的声明:
声明格式:
返回值类型 函数名(第一个参数类型 形参名,第二个参数类型 形参名…);
原函数有多少参数就写多少参数;
例子:
int func(int a,int b,int c,int d,int e);
或者
int func(int ,int ,int ,int ,int );
声明的意义:
为了调用该函数时,能访问到该函数的函数原型
声明的位置:
在目标函数被调用的位置之前进行声明
若目标函数的原型定义位置,在被调用的位置之前,则可以不再额外声明
同一函数内怎样声明:
因为编译器的原因,有些环境下可以不用提前声明
但是建议按照规则进行声明
或者干脆把将被调用的函数的原型,定义在被调用位置之前;
练习:
练习:
- 求取所有的水仙花数
- 输入一个十进制数N,将它转换成R进制数输出。
-
输入
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。 -
输出
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
- 给定一个日期,输出这个日期是该年的第几天。
-
输入
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。 -
输出
对于每组输入数据,输出一行,表示该日期是该年的第几天。
答案参考:
练习一:
#include <stdio.h>
int main()
{
int a,x,y,z;
for(a=100;a<=999;a++)
{
x = a%10;
y = a/10%10;
z = a/100;
if(a==x*x*x+y*y*y+z*z*z)
{
printf("水仙花:%d\n",a);
}
}
return 0;
}
练习二:文章来源:https://www.toymoban.com/news/detail-611234.html
#include <stdio.h>
int func(int num,int n) //实现目标数字转换进制
{
int temp[32]={0};
int i = 0;
while(1) //0 != num
{
temp[i] = num%n; //利用取商留余法
num /= n;
i++;
if(num == 0)
{
break;
}
}
for(i--;i>=0;i--)
{
if(temp[i]<10)
{
printf("%c",temp[i]+48); //48是0的ASCII
}
else
{
printf("%c",temp[i]-10+65); //65是A的
}
printf("\n");
}
}
int main()
{
int num,n;
printf("请输入数字和进制:");
scanf("%d%d",&num,&n);
func(num,n);
return 0;
}
练习三:文章来源地址https://www.toymoban.com/news/detail-611234.html
#include <stdio.h>
int main()
{
int year,month,day,sum,x;
printf("请输入日期(YYYY/MM/DD):");
scanf("%d/%d/%d",&year,&month,&day);
switch(month)
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break;
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default:printf("data error");break;
}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day>31)
{
printf("day 错误\n");
return 0;
}
}
if(month==4||month==6||month==9||month==11)
{
if(day>30)
{
printf("day 错误\n");
return 0;
}
}
if(month==2)
{
if(year%400==0||year%4==0&&!year%100==0)
{
if(day>29)
{
printf("day 错误\n");
return 0;
}
}
else
{
if(day>28)
{
printf("day 错误\n");
return 0;
}
}
}
sum = sum+day;
if(year%400==0||year%4==0&&!year%100==0)
{
x = 1;
}
else
{
x = 0;
}
if(x==1&&month>2)
{
sum++;
}
printf("这天是该年的%d天\n",sum);
}
到了这里,关于006-函数递归,内联,变参,声明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!