C语言零基础从入门到精通之—递归

本文详细介绍了递归的概念,包括递归的定义、基本思想及存在的必要条件。通过多个递归实例,如打印整数、计算字符串长度、求阶乘和斐波那契数列,展示了递归的使用及其可能遇到的栈溢出问题。同时,文章讨论了解决栈溢出的方法,如转换为尾递归和非递归形式,并分析了递归与迭代的选择策略。最后提到了递归的经典问题,如汉诺塔和青蛙跳台阶问题。
摘要由CSDN通过智能技术生成

递归



一,什么是递归

1.递归的详细定义

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

2.递归的简单理解

所谓递归从字面意思上就可以看出来,递归可以拆分成传递和回调两个过程,递归是一个不断调用自身,并返回结果的过称,当然递归也不可能无限制的调用返回,需要条件来控制递归,并且需要有程序实现不断地向递归的条件靠拢,否则就算有递归的条件,也只是不断地在原地踏步,这也就指出了递归的两个条件

3.递归的基本思想

递归的基本思想,是把规模较大的一个问题,分解成规模较小的多个处理方法相同的子问题去解决,而每一个子问题又可以继续拆分成多个更小的处理方法相同的子问题。

最重要的一点就是假设所有的子问题已经解决了,现在要基于已经解决的子问题来解决当前问题;递归就是一个逐层深入的过程,打个比方就好比,就相当于与我们编程的时候遇到一个特别难的问题,我自己不能解决,我们需要求助他人,这个难题很多人都解决不了,最后传到了编程界最牛的人手里被解决了(这就好比递归的限制条件,如果大牛都解决不了那不崩了),当大牛解决问题后答案被返还回我,这样这个问题就被我解决了,这就是递归。

在这里插入图片描述

4.递归存在的两个必要条件

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续。

  • 每次递归调用之后越来越接近这个限制条件。

二, 如何使用递归以及使用过程中的一些问题

1.举例练习递归

例1 接受一个整形值(无符号),按顺时针打印它的每一位。例如:输入:1234,输出1 2 3 4.
#include<stdio.h>

void print(int n)
{
   
	if (n > 9)
	{
   
		print(n / 10);
	}
	printf("%d\n", n % 10);
}

int main()
{
   
	int num = 1234;
	print(num);
	return 0;
}

代码分析:这是一个很简单的代码,目的是输入1234,输出1 2 3 4 首先进入函数print,当n大于9时执行程序,否则执行下一句程序,当输入1234时,进入判断条件,在一次调用print函数,并将n/10,变成123,在一次进入print函数,执行判断语句,变成12,再重复上述过程直到n = 1,时,再一次进入print程序时不满足条件,执行下面条件输出1,然后返回上一级输出2,依次输出3,4,具体过程如图所示

在这里插入图片描述

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

首先,我们先用一个创建临时变量代码实现求字符串长度的代码,来进一步加深不用创建临时变量求字符串长度的方法

#include<stdio.h>

int mn_strlen(char* p)
{
   
	int count = 0;
	while (*p != '\0')
	{
   
		p++;//将指针后移一位
		count++;//如果不是\0就是自增1
	}
	return count;
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值