C语言递归及经典例题详解

这篇具有很好参考价值的文章主要介绍了C语言递归及经典例题详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 什么是递归?

什么时候使用递归

例题1 顺序打印问题

例题2 求n的阶乘

例题3 求第n个斐波那契数

经典 汉诺塔问题

经典 青蛙跳台阶问题 

什么是递归?

递归就是程序调用自身的编程技巧。递归通常把一个大型复杂的问题层层转化为一个与原问题相似,规模较小的问题来求解。递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复的计算,大大减少程序的代码量。

递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

什么时候使用递归?

1、大问题可以拆分成若干小问题。

2、原问题与子问题除数据规模不同,求解思路完全相同。

3、存在递归终止条件。

4、当不满足终止条件时,要如何缩小函数值,并让其进入下一层循环中。

例题1 顺序打印问题:

输入一个整数123,依次在屏幕打印1 2 3 

代码:

#include <stdio.h>
void print(int n)
{
	if (n > 10)
	{
		print(n / 10);
	}
	printf("%d ", n%10);
}
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	print(n);
	return 0;
}

C语言递归及经典例题详解

例题分析:本题的思路不断拆分整数,并将他们一一打印,只要n>10,就另n不断除以10,不断的递归调用n/10,当n<10时,满足递归终止条件,令n%10,此时我们得到的是此数的最高位。当打印完最高位时返回,继续打印不一定是个位数,所以%10只保留个位。

例题2 求n的阶乘:

代码:

int Fac(int n)
{
	if (n == 1)
	{
		return 1;
	}
	return n*Fac(n - 1);
}
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ret = Fac(n);
	printf("%d", ret);
	return 0;
}

C语言递归及经典例题详解

例题分析: 求n!就是不断求n*(n-1)的过程,而这个过程又分为2种情况,当n=1时,n!=1;当n>1时,n!=n*Fac(n-1)。我们求Fac(n),就是不断求Fac(n-1)的过程,当不断递归求到Fac(1)时,依次计算阶乘返回,最终得到n!

例题3 求斐波那契数列

求第n个斐波那契数

代码:

int Fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	return Fib(n - 1) + Fib(n - 2);
}
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	int ret = Fib(n);
	printf("%d", ret);
	return 0;
}

C语言递归及经典例题详解

例题分析:斐波那契数列就是前两个数为1,从第3个数开始,所有数都为前两个数的和。这样的话我们可以分成两种情况,一种是n<=2时,第n个斐波那契数的值为1;当n>2时,第n个斐波那契数的值为Fib(n-1)+Fib(n-2)。

经典 汉诺塔问题:

该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A,辅助柱B及目标柱C。

操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于任意杆上。

C语言递归及经典例题详解

问题分析:为了便于理解,我们首先分析3个盘子的移动过程:

1、将A柱上的两个盘子移动到B柱(借助C)

2、将A柱上的一个盘子移动到C柱

3、将B柱上的2个盘子移动到C柱(借助A)

C语言递归及经典例题详解其中,第2步直接将最大盘放到C柱可直接实现。

第1步又可以分解为:

1.1 将A柱上的一个盘子移动到C

1.2 将A柱上的第二个盘子移动到B

1.3 将C柱上的盘子移动到B

C语言递归及经典例题详解 

第3步又可以分解为:

3.1 将B柱的第一个盘子移动到A柱

3.2 将B柱的第二个盘子移动到C柱

3.3 将A柱的一个盘子移动到C柱

C语言递归及经典例题详解

 综上可以得到3个盘子的移动步骤:

A->C

A->B

C->B

A->C

B->A

B->C

A->C

以上3个盘子移动共经历了7步完成。

从这里我们可以推出规律:如果有n个盘子移动,一共会经历2^n-1步。 

所以如何移动n个盘子呢?

道理和3个盘子移动是一样的,移动过程如下:

1、将A柱上的n-1个盘子移动到B柱(借助C)

2、将A柱上的一个盘子移动到C柱

3、将B柱上的n-1个盘子移动到C柱(借助A)

代码: 

#include <stdio.h>
void move(char x, char y)
{
	printf("%c-->%c\n", x, y);
}
void hanoi(int m, char one, char two, char three)
{
	if (m == 1)
	{
		move(one, three);
	}
	else
	{
		hanoi(m - 1, one, three, two);
		move(one, three);
		hanoi(m - 1, two, one, three);
	}
}
int main()
{
	int m = 0;
	printf("请输入移动盘子的数量:>\n");
	scanf_s("%d", &m);
	hanoi(m, 'A', 'B', 'C');
	return 0;
}

移盘方案:

C语言递归及经典例题详解

经典 青蛙跳台阶问题: 

一只青蛙一次可以跳上一级台阶,也可以跳上2级,求该青蛙跳上n级的台阶总共有多少种跳法(先后次序不同算不同结果)。

例题分析:此题可以分为台阶有1,2,3....n级台阶。

台阶为1级时:有1种跳法

台阶为2级时:有2种跳法

台阶为3级时:有3种跳法

台阶为4级时:有5种跳法

........

台阶为n级时:有(n-1)+(n-2)种跳法

代码:

int jumpFloor(int m)
{
	if (m == 1)
	{
		return 1;
	}
	else if (m == 2)
	{
		return 2;
	}
	else
	{
		return jumpFloor(m - 1) + jumpFloor(m - 2);
	}
}
int main()
{
	int target = 0;
	printf("请输入青蛙所要跳的台阶数:>\n");
	scanf_s("%d", &target);
	int ret = jumpFloor(target);
	printf("%d\n", ret);
	return 0;
}

感谢阅读,欢迎大家批评指正!文章来源地址https://www.toymoban.com/news/detail-449126.html

到了这里,关于C语言递归及经典例题详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【递推与递归】python例题详解

    文章目录 1、递归实现指数型枚举 2、递归实现排列型枚举 3、递归实现组合型枚举 4、简单斐波那契 5、带分数 6、翻硬币 1、递归实现指数型枚举 题目 从 1∼n这 n个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数 n。 输出格式 每行输出一种方

    2024年04月25日
    浏览(27)
  • c++详解递归算法-全网最全+例题讲解

    什么是递归? 递归的思想是什么? 什么时候该用递归? 使用递归需要注意哪些问题? 递归思想解决经典问题 递归和循环的区别是什么? 递归算法: 定义:直接或间接地出现对自身的调用 本质:递归即 递进 与 回归, 基本思想就是把规模大的问题转化为规模小的相似的子

    2024年02月07日
    浏览(32)
  • 有关C语言指针的经典例题

     1.通过地址运算符获得地址值   2.输入a,b,按从小到大的顺序输出 3 3.用指针法访问数组元素  4.从键盘输入10个整数,放入一堆数组a中,然后将该数组中的元素值依次输出  5.将10个数的最小值换到最前面的位置 6.求二维数组元素的最大值  7.用指针法实现字符串的复制 8

    2024年02月04日
    浏览(30)
  • c语言经典例题讲解(输出菱形,喝汽水问题)

    目录 一、输出菱形 二、喝汽水问题 方法1:一步一步来   方法二:直接套公式   输出类似于下图的菱形:    通过分析:1、先分为上下两部分输出                    2.在输出前先输出空格                   3.找规律进行输出 可知,可令上半部分line行,下半部分便是

    2024年02月13日
    浏览(25)
  • 数字IC/FPGA面试宝典--经典60道例题详解

    1.关于亚稳态的描述错误的是(A) A、多用几级寄存器打拍可以消除亚稳态。 B、亚稳态是极不稳定的,理论上来讲处在亚稳态的时间可以无限长。 C、亚稳态稳定到0或者1,是随机的,与输入没有必然的关系。 D、如果数据传输中不满足触发器的建文时间Tsu和保持时间Th,可能

    2024年01月16日
    浏览(39)
  • 动态规划详细讲解c++|经典例题讲解认识动态规划|0-1背包问题详解

    uu们,你们好!这次的分享是动态规划,其中介绍了动态规划的相关概念和做题模板(三要素),同时为了uu们对动态规划方法有更加形象的认识,特地找了两个经典问题,和大家一起分析。并且呢,为了大家检验自己的学习成果,我专门在常用的oj上为uu们找到了相关题目的

    2024年04月11日
    浏览(49)
  • C语言经典100例题(51-54)--学习使用按位与& ,按位或 |,按位异或 ^和按位取反~

    目录 题目 问题分析 按位与操作符() 按位或操作符(|) 按位异或操作符(^) 按位取反操作符(~) 代码及运行结果  学习使用按位与 ,按位或 |,按位异或 ^和按位取反~ 对两个二进制数的对应位进行与操作。如果两个位置上的位都是1,则结果为1,否则为0。 0 0 = 0; 0 1 = 0

    2024年02月09日
    浏览(33)
  • C语言经典100例题(55)--从一个整数a中把从右端开始的4-7位取出来

    目录 题目 问题分析 右移操作符 左移操作符 方法一 方法二  运行结果 用c语言从一个整数a中把从右端开始的4-7位取出来           右移操作符是一种位运算符,用于将二进制数向右移动指定的位数。它通常用符号\\\" \\\"表示。右移一位相当于将二进制数除以2,右移n位相当

    2024年02月09日
    浏览(33)
  • C语言:指针典型例题详解

    基于对前面的深入理解指针1,2,3,4的学习,本篇文章带来指针的典型例题。俗话说:光说不练假把戏。在指针的学习过程中最重要的还是要学会动手实操。 学习本节内容之前,先复习一下涉及的相关知识,以便更好的理解。 除了博主指针专题的博文---《深入理解指针1,2,3,4》之

    2024年04月09日
    浏览(29)
  • 回溯递归(例题+思路+代码)

    leetcode 77 组合问题适合用回溯求解。 经典解法:for循环 + 内部回溯。 每次进入回溯方法时,先判断终止条件,再进行当前层的循环,循环进行下一层递归。 由于递归本质其实就是暴力解法,所以会经过许多没有必要的节点。 该题中,如果n=4,k=3,那么在第二层中的3和4都是

    2023年04月19日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包