C语言初阶—9函数

时间:2024-04-08 20:12:52

函数的声明

(main函数前)----告诉有一个函数

格式:  类型 函数名(参数);

函数的声明 放到头文件add.c

函数的定义

----创建函数----放到add.c

格式:类型 函数名(参数)

{

语句项;

}

在文件中包含头文件

#include "add.h"

包含头文件-实质上就拷贝头文件的声明 到文件

导入静态库

#pragma comment (lib, "add.lib")

函数的递归

例1: 输入无符号整形unsigned int数,打印每一位print 

%u 打印无符号整形数

#include<stdio.h>
void print(unsigned int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);
}

int main()
{
	unsigned int n = 0;
	scanf("%u", &n);
	print(n);

	return 0;
}

例2: 函数不允许创建临时变量,求字符串长度my_strlen

1.有临时变量

#include<stdio.h>

void my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	printf("%d\n", count);
}

int main()
{
	char str[] = "abcdef";
	my_strlen(&str);
	return 0;
}

2.无临时变量--递归

#include<stdio.h>

int my_strlen(char* str)
{
	if (*str != '\0')
	{
		return 1 + my_strlen(++str);
	}
	return 0;
}

int main()
{
	char str[] = "abcdef";
	printf("%d\n", my_strlen(&str));
	return 0;
}

例3: 不考虑溢出, 求N的阶乘fac()

1.递归

//1.递归
#include <stdio.h>

int Fac(int n)
{
	if (n == 1)
		return 1;
	else
	{
		return n*Fac(n-1);
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", Fac(n));
	return 0;
}

2.迭代--循环

//非递归
#include <stdio.h>

int main()
{
	int n = 0;
	int fac = 1;
	scanf("%d", &n);
	if (n == 1)
		fac = 1;
	while (n > 1)
	{
		fac = n * fac;
		n--;
	}
	
	
	printf("%d\n", fac);
	return 0;
}

例4: 不考虑溢出, 求斐波那契数列Fib()

1.递归

//递归
#include<stdio.h>

int Fib(int n)
{
	if (n == 1 || n == 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", Fib(n));
	return 0;
}

2.非递归

//2.非递归
#include <stdio.h>
int main()
{
	int a = 1;
	int b = 1;
	int fib = 1;
	int n = 0;
	scanf("%d", &n);
	if (n == 1 | n == 2)
		fib = 1;
	while (n > 2)//5
	{
		fib = a + b;
		a = b;
		b = fib;
		n--;
	}
	printf("%d\n", fib);
	return 0;
}

函数在调用过程中重复过多,使用非递归