函数(2)

目录

6.函数的声明和定义

6.1函数声明

6.2函数定义

7.函数递归

7.1什么是递归

7.2递归的两个必要条件


6.函数的声明和定义

6.1函数声明

1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么

例:int  Add(int x, int y);

函数名:Add

参数:x,y(参数的类型是int)

返回类型:int

2.函数的声明一般出现在函数的使用之前,要满足先声明后使用

6.2函数定义

函数的定义是指函数的具体实现,交代函数的功能实现

举个栗子:使用函数实现加法操作

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int x, int y);//函数声明
int main()
{
	int a = 5;
	int b = 10;
	int sum = Add(a, b);//函数调用
	printf("%d\n", sum);
	return 0;
}
//函数定义
int Add(int x, int y)
{
	return x + y;//函数内容
}

7.函数递归

7.1什么是递归

函数调用自身的编程技巧称为递归

使用条件:一个过程或一个函数在其定义或说明中有直接或间接调用自身的

实现方法:把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,只需要少量的程序就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码量

核心思想:大事化小

7.2递归的两个必要条件

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续
  • 每次递归调用之后越来越接近这个限制条件

练习题1:接受一个整型值(无符号),按照顺序打印它的每一位

例:输入:1234        输出:1 2 3 4

思路1:使用数组

通过取余操作可以得到这个整数的最低位,采用循环的方式,将这个整数的每一位存储在一个整形数组中,再逆序打印这个数组,即可实现题目要求 

 代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int n = 1234;
	int arr[10] = { 0 };
	int i = 0;
	int j = 0;
    //把1234存入数组中
	for (i = 0; i < 4; i++)
	{
		arr[i] = n % 10;
		n /= 10;
	}
    //逆序打印数组
	for (j = 3; j >= 0; j--)
	{
		printf("%d ", arr[j]);
	}
	return 0;
}

运行结果: 

思路2:使用递归

打印1234的每一位,我们通过取余操作(1234%10)可以得到最后一位4,打印出来

这样我们只需要打印123的每一位,同样,通过取余操作(123%10)得到3打印出来

接着只需要打印12的每一位,取余(12%10)得到2打印出来

最后剩1打印

我们构造一个函数print,把num的每一位打印出来

print(1234)                //打印1234的每一位

print(123)     4           //打印123的每一位和4

print(12)     3  4        //打印12的每一位和3和4

print(1)     2   3  4     //打印1的每一位和2和3和4

代码如下 :

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//print函数的返回值为空,参数为int类型
void print(int n)
{
    //当只剩一位数的时候,不需要再进行递归,直接打印即可
	if (n > 9)
	{
        //每次递归的参数为去掉最后一位的数
		print(n / 10);
	}
    //打印最后一位数
	printf("%d ", n % 10);}
int main()
{
	unsigned int num = 0;
	scanf("%d", &num);
	print(num);//调用函数
	return 0;
}

 运行结果:

递归的具体步骤如下图所示:

练习题2:编写函数,不允许创建临时变量,求字符串长度:

题目分析:我们先编写函数,求字符串长度,不看题目中不允许创建临时变量的要求

在这段代码中,我们创建了一个全局变量count,用来计数

当不允许创建临时变量时,我们就要换一种方法解决问题

对字符串"abcd":求它的长度

先判断第一个字符是否为0:

如果为0,则返回字符串的长度为0;

如果不为0,则该字符串的长度为1+“bcd”的长度

判断第二个字符是否为0:

不为0,则该字符串的长度为1+1+“cd”的长度

判断第三个字符是否为0:

不为0,则该字符串的长度为1+1+1+“d”的长度

判断第四个字符是否为0:

不为0,则该字符串的长度为1+1+1+1+“\0”的长度

判断第五个字符是否为0:

第五个字符为0,所以该字符串的长度为1+1+1+1=4

综上所述:采取递归的方式求解

代码如下: 

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

运行结果如下: 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值