目录
关于头文件
#ifndef __ADD_H_ //ifndef是指如果没有定义后面的函数
#define __ADD_H_ //__ADD_H__ 按头文件名称来写
int Add(int a,int b); //函数的声明,也可以直接写成Add执行代码
#endif //在自定义函数的头文件前后加上ifndef和endif可避免反复引用头文件使项目冗杂
//位于add.h文件中
声明的函数(Add函数)在.c文件中实现
函数递归
递归
程序调用自身的编程技巧就是递归,递归可大大减少代码量
int main()
{
printf("hello world\n");
main();
return 0;
}
以上是比较简单的递归,执行后会反复打印hello world,但不会一直执行下去,会出现栈溢出执行就会终止
栈溢出
电脑内存大概会分为 |栈区| |堆区| |静态区|
栈区中放的是局部变量和函数的形参;堆区放的是动态开辟的内存;静态区中放的是全局变量和
static创建的变量
当执行上诉代码是会一直向栈区申请空间,当申请满时就会出现栈溢出(stack over flow)的错误
应用:
一:输入1234,按顺序输出1 2 3 4
#include <stdio.h>
void print(int a)
{
if (a>9)
{
print(a/10);
}
printf("%d\n", a%10);
}
int main()
{
unsigned int num=0;
scanf("%d",&num);
print(num);
return 0;
}
思路:1234%10=4,再1234/10=123(因为是unsigned int类型,所以无小数),然后123%10=3...
二:写个函数,可在不创建临时变量的情况下计算字符串长度
循环(创建了count临时变量)
#include <stdio.h>
int istrlen(char* a)
{
int count = 0;
while (*a != '\0')
{
count++;
a++;
}
return count;
}
//用函数模拟实现了strlen函数
int main()
{
char arr[]="hello,world";
int len=istrlen(arr);
printf("%d\n",len);
return 0;
}
递归
#include <stdio.h>
int istrlen(char* a)
{
if (*a != '\0')
{
return 1+istrlen(a+1);
}
else
{
return 0;
}
}
int main()
{
char arr[]="hello,world";
int len=istrlen(arr);
printf("%d\n",len);
return 0;
}
三:求N的阶乘
循环
#include <stdio.h>
int Fac(int n)
{
int i = 0;
int ret = 1;
for ( i = 1; i <=n; i++)
{
ret *= i;
}
return ret;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fac(n);
printf("%d\n",ret);
return 0;
}
递归
#include <stdio.h>
int Fac(int n)
{
if (n<=1)
{
return 1;
}
else
{
return n*Fac(n-1);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fac(n);
printf("%d\n",ret);
return 0;
}
四:求第N个斐波那契数
循环
#include <stdio.h>
int Fib(int n)
{
int a=1;
int b=1;
int c=1;
while (n>2)
{
c=a+b;
a=b;
b=c;
n--;
}
return c;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d",&a);
b = Fib(a);
printf("%d\n",b);
return 0;
}
递归(不适合N过于大)
#include <stdio.h>
int Fib(int n)
{
if (n<=2)
{
return 1;
}
else
{
return Fib(n-1)+Fib(n-2);
}
}
int main()
{
int a = 0;
int b = 0;
scanf("%d",&a);
b = Fib(a);
printf("%d\n",b);
return 0;
}