C语言 函数递归,通过练习了解递归调用的详细过程。接受一个整型值(无符号),按照顺序打印它的每一位。例如:输入:1234,输出 1 2 3 4。

什么是递归?

程序调用自身的编程技巧称为递归。递归作为一种算法在程序设计语言中广泛应用。一个过后或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在于:把大事化小。

递归的两个必要条件:

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

举例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main(void)
{
	printf("haha\n");
	main();
	return 0;
}

上面程序main()自己调用自己,属于递归,但此处是个死循环。后面会跳出栈溢出的错误提示:

关于栈溢出可到此网站了解(程序员的知乎网):https://strackoverflow.com

写递归代码的时候注意:

  1. 不能死递归,需要有跳出条件,每次递归逼近跳出条件
  2. 递归层次不能太深,不然也可能栈溢出

练习

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

分析:

 不用递归方法如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
	unsigned int num = 0;
	int k;
	int f = 1;
	int x, y;
	int z = 0;
	int arr[20] = { 0 }; 
	//unsigned int能表示的数值范围是[0, 2^(32) - 1],超过会溢出
	scanf("%u", &num);  //假设输入:1234
	k = num % 10;  //先把个位数求出来
	arr[0] = k;
	while (num / 10 != 0)   //如果num是个位数的话,就不用进入循环了
	{
		x = num / 10;
		y = x % 10;
		//printf("%d ", y);   //用来测试
		num = num / 10;
		arr[f] = y;
		//printf("%d\n", arr[f]);   //用来测试
		f++;	
	}
	//printf("%d\n", f);    //用来测试,此时已经可以得出num的长度就是y
	for (z = f - 1; z >= 0; z--)
	{
		printf("%d\n", arr[z]);   
	}
	return 0;
}

输出结果:

用递归方法代码如下: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void p(unsigned int n)
{
	if (n > 9) //递归限制条件,控制递归啥时候进去啥时候出去
	{
		p(n / 10);  //使得每次递归调用之后越来越接近限制条件
	}
	printf("%d ", n % 10);
}
int main(void)
{
	unsigned int num = 0;
	scanf("%u", &num);  //1234
	//递归——函数自己调用自己
	p(num); //p函数可以打印参数部分数字的每一位

	return 0;
}

运行结果:

递归调用的详细过程解析

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
“新概念C语言”突破了以往任何一种语言教材的旧的模式,将教学内容分为入门篇和提高篇两个篇章。在入门篇中只引进程序设计必要的语法现象,达到快速入门。激发兴趣的目的。在入门篇和提高篇之间插一个强化上机实验周,巩固学习内容。在提高篇中完成完整的语法、算法、程序设计思想等教学目的的学习任务。由于学生对语言已具有了初步的了解并掌握了最基本的语法和程序设计思想,能设计较简单的程序,所以在提高篇的学习中,不论对灵活语法的学习和掌握,还是对程序设计思想的掌握都更加容易,从而可以较容易达到教学目标。 第一部分 入门篇 1 第1章 C语言的产生及其工作流程 3 1.1 C语言的产生 3 1.2 程序和程序设计 3 1.2.1 C程序 3 1.2.2 程序设计 4 习题 4 第2章 C程序设计的初步知识 5 2.1 简单C程序的构成和格式 5 2.2 常量、变量和标识符 6 2.2.1 标识符 6 2.2.2 常量 7 2.2.3 用定义一个符号名的方法来代表一个常量 7 2.2.4 变量 8 2.3 整型数据 8 2.3.1 整型常量 8 2.3.2 整型变量 8 2.4 实型数据 9 2.4.1 实型常量 9 2.4.2 实型变量 9 2.5 字符型数据 10 2.5.1 字符常量 10 2.5.2 字符串常量 11 2.5.3 字符变量 11 2.6 算术表达式 11 2.6.1 基本的算术运算符 11 2.6.2 运算符的优先级、结合性和算术表达式 12 2.6.3 强制类型转换表达式 13 2.7 赋表达式 13 2.7.1 赋运算符和赋表达式 13 2.7.2 赋运算中的类型转换 14 习题 15 第3章 顺序结构程序 16 3.1 复合语句和空语句 16 3.1.1 复合语句 16 3.1.2 空语句 16 3.2 程序举例 16 习题 17 第4章 选择结构 19 4.1 关系运算和逻辑运算 19 4.1.1 C语言中的逻辑 19 4.1.2 关系运算符和关系表达式 19 4.1.3 逻辑运算符和逻辑表达式 20 4.2 if语句和用if语句构成的选择结构 21 习题 22 第5章 循环结构 25 5.1 for语句和用for语句构成的循环结构 25 5.1.1 for语句构成的循环结构 25 5.1.2 for循环的执行过程 25 5.1.3 有关for语句的说明 25 5.2 循环结构的嵌套 27 习题 28 第6章 函数 30 6.1 函数的定义和返回 30 6.1.1 函数定义的语法 30 6.1.2 函数的返回 30 6.2 函数用 32 6.2.1 函数用方式 32 6.2.2 函数用时的语法要求 32 6.3 函数的说明 33 6.3.1 函数说明的形式 33 6.3.2 函数说明的位置 34 6.4 函数和被函数之间的数据传递 34 6.5 库函数 36 6.6 数据输入输出及常用库函数 37 6.6.1 printf函数(格式输出函数) 37 6.6.2 scanf函数(格式输入函数) 39 6.6.3 用putchar和getchar函数输出输入字符 40 6.7 程序举例 41 习题 43 第7章 数组 45 7.1 一维数组的定义和一维数组元素的引用 45 7.1.1 一维数组的定义 45 7.1.2 一维数组元素的引用 46 7.1.3 一维数组的初始化 46 7.1.4 一维数组的定义和数组元素引用举例 47 7.2 函数之间对一维数组和数组元素的引用 47 7.2.1 数组元素做实参 47 7.2.2 数组名做实参 49 7.3 一维数组应用举例 50 7.4 字符数组 53 7.4.1 字符数组的定义 53 7.4.2 字符数组的初始化 54 7.4.3 字符数组的引用 54 7.4.4 字符串与字符串结束标志 55 7.4.5 字符数组的输入输出 56 7.4.6 字符串处理函数 58 7.4.7 字符数组应用举例 60 习题 61 第8章 文件 63 8.1 C语言文件的概念 63 8.2 打开文件 64 8.3 关闭文件 65 8.4 用getc(fgetc)和putc(fputc)等常用函数进行输入输出 65 8.5 判断文件结束函数feof 68 习题 69 第二部分 提高篇 71 第9章 算法 73 9.1 算法 73 9.2 结构化程序设计和模块化结构 74 9.2.1 结

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值