C语言之函数(2)

本文介绍了编程中的函数声明与定义,强调了先声明后使用的原则,并展示了函数在不同模块间的组织方式。同时,深入探讨了递归的概念,给出了递归打印整数位和计算字符串长度的例子。递归的两个必要条件是限制条件和逐步逼近目标状态。此外,通过对比递归和迭代,解释了如何用递归和迭代方法分别计算阶乘和斐波那契数列,指出迭代在效率上的优势。最后,提到了递归在解决汉诺塔和青蛙跳台阶问题中的应用。
摘要由CSDN通过智能技术生成

1、函数的声明和定义

a、函数的声明,在函数的使用之前,说明存在一个函数,说明函数的返回值类型,名字,形参,形式参数的名字可以省略,一定要先声明后使用

b、函数的定义,详细地写出函数返回值类型,函数名,形参,函数所要实现的某些功能。

做一个较大型的项目,需要多个模块时,可以把每个函数声明放到 .h 文件中,可以把函数定义放到 .c 文件中,在主函数中正常使用函数是,需要引用头文件 #include"add.h"

//主函数所在的模块
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"add.h"

int main()
{
	int x = 0;
	int y = 0;
	scanf_s("%d %d", &x, &y);
	int sum = Add(x, y);
	printf("%d", sum);
	return 0;
}

//函数声明所在模块  .h  文件中
int Add(int a, int b);

//函数定义所在的模块   新的 .c 文件中  

int Add(int a, int b)
{
	return a + b;
}

使用别人提供的静态库里的函数,需要引用,我没有了解多少。

2、函数递归

递归:程序调用自身的编程技巧。自己调用自己。一个过程或函数在其定义过程中直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。只需要少量程序就可以解决一些需要重复的步骤的问题,最主要为大事化小。

例题:接受一个无符号的整型值,按照顺序打印它的每一位。 例 输入1234,输出 1 2 3 4 。

#include<stdio.h>
void print(int n)
{
	if (n > 9)
	{
		print(n /10);
	}
	printf("%d ", n % 10);
}
int main()
{
	unsigned int num=0;
	scanf_s("%d ", &num);
	print(num);//print函数可以把num的每一位按照顺序打印出来
	return 0;
}

递归的两个必要条件:(1)、存在限制条件,当满足这个限制条件的时候,递归便不再继续。(2)、每次递归调用之后越来越接近这个限制条件。

例题:编写函数不允许创建临时变量,求字符串的长度。


#include<stdio.h>
int my_strlen(char* str)
{
	if (*str != '\0')
	{
		return 1 + my_strlen(str + 1);
	}
	else
	{
		return 0;
	}
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

3、递归与迭代

迭代相当于循环,递归有很多可以写成迭代的方式。

例题:用递归的方法求n的阶乘

#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);
	int ret = fac(n);
	printf("%d\n", ret);
	return 0;

}

例题:求第n个斐波那契数(前两个数之和等于第三个数).

fib(n)=fib(n-1)+fib(n-2)(n>=2)

a、递归法存在缺陷,五十次往上的数计算速度会下降很多

#include<stdio.h>
int fib(int m)
{
	if (m <= 2)
	{
		return 1;
	}
	else
	{
		return fib(m - 1) + fib(m - 2);

	}
}
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ret = fib(n);
	printf("%d\n", ret);
	return 0;
}

b、迭代法,优于用递归法。

#include<stdio.h>
int fib(int m)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while(m>2)
	{
		c = a + b;
		a = b;
		b = c;
		m--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ret = fib(n);
	printf("%d\n", ret);
	return 0;

}

递归重要例题:汉诺塔问题,青蛙跳台阶问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值