递归:本质是函数的嵌套调用
两个条件:
1、必须有一个函数入口。
2、除了最后一次的操作可以不一样,其他每次操作必须一样。
递归:先找到前一次的运算,并且所有步骤都能用到统一个式子。
1.阶乘5!;
int sum = 1;
for(i = 1;i <= 5;i++)
sum = sum * i;
1的阶乘加到20的阶乘。
for(i = 1;i <= 5;i++)
sum = sum * i;
代表5的阶乘,在i从1到5的过程中,分别求了各个数的阶乘,所以在这一过程中,分别把他们加起来,就是1到5的阶乘之和。
double sum = 1;
double sum0 = 0;
for(i = 1;i <= 20;i++)
sum = sum * i;
sum0 = sum0 + sum;
printf("%e,%e\n",sum,sum0);sum0就是所求的阶乘之和
数据够大时需要用double类型,并且下面输出时要用%e
int fn(int n)
{
if(n == 0 || n == 1)
return 1;
else
return fn(n - 1) * n;
}
int sum(int n)
{
if(n == 0 || n == 1)
return 1;
else
return sum(n - 1) + n;
}
void test(int n)
{
if(n != 0)
test(n / 8);
printf("%d\n",n % 8);
}
汉诺塔
void move(char x,char y)
printf("%c -> %c \n",x,y);//把x移动到y上
void hn(char a,char b,char c,int n)//从第一个参数到第三个参数借助第二个参数
{
if(n == 1)
move(a,c);
else
{
hn(a,c,b,n - 1)
move(a,c);
hn(b,a,c,n - 1)
}
}
void main()
{
test(10);
printf("%d\n",fn(5));
printf("%d\n",sum(100));
hn('a','b','c',99);
}
快排
void qs(int a[],int left,int right)
{
int i = left;
int j = right + 1;
int curr = a[left];
int t;
if(i < j)
{
do
{
do
{
++i;
}while(curr >= a[i] && i <= right);
do
{
--j;
}while(curr <= a[i] && j > left);
if(i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}while(i < j);
if(i > j)
{
t = a[left];
t[left] = a[i];
a[j] = t;
}
qs(a,left,j-1);
qs(a,j + 1,right);
}
}
预处理命令(预命令)
1.宏定义
2.文件包含
<>–在安装目录中寻找
“”-现在本工程目录查找,如果找不到,再寻找安装目录
3.条件编译
#ifndef … #define…#endif->目的主要解决头文件重复包含
#define PI 3.14 //正确
宏定义后,如果程序中用到时需要一模一样抄写下来;
#define Max(x,y) ((x) > (y)) ? (x) : (y))//能带括号的全部带上,不会错
#define fn(a,b) (a * b)[另一种-((a) * (b))]//这时候要看带括号没注意运算
#define Year (365 * 24 * 60 * 60) UL //具体用时需要在每个数后面都加上UL,无符号整型
条件编译:
#ifndef N
printf("aaa\n");
#else
printf("bbb\n");
#endif