递归算法小结(数的阶乘、斐波那契和汉诺塔问题)

方法递归(斐波那契数列,青蛙跳台阶,汉诺塔问题) 这里写自定义目录标题递归的概念递归执行过程的详细分析经典递归问题分析与解答斐波那契数列问题青蛙跳台阶问题汉诺塔问题 递归的概念 什么是递归? 程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可 描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小 递 阅读详情

  递归是一项重要的编程技术,它让函数可以从函数体内部调用自身。递归通常把一个大型复杂的问题层层简化为一个,与原问题相似的规模较小的问题来求解,使用递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,这样就大大地减少了程序的代码量。但是使用递归的时候需要消耗较多的栈空间,所以递归次数过多容易造成栈溢出等。在堆栈尺寸受到限制的时候 ,一般需要避免使用递归。

1.什么是递归
  递归指的是函数在定义中直接或间接使用函数自身的方法。因此递归可分为直接递归和间接递归:
 (1)直接递归:递归函数直接调用该函数本身。
 (2)间接递归:一个递归函数调用另一个递归函数,再从另一个递归函数调用回原来的递归函数。   

2.递归的条件
 (1)可以反复执行的递归过程。
 (2)有一个跳出递归过程的条件,也就是不能无限递归。

3.递归应用1--数的阶乘

用递归实现一个给定数的阶乘。

递归C语言实现:
#include <stdio.h>

double factorial(unsigned int i);

int main(){
	unsigned int i = 5;
	
	printf("%d 的阶乘为 %lf\n", i, factorial(i));
	
	return 0;
}

double factorial(unsigned int i){
	if(i <= 1){
		return 1;
	}
	return i * factorial(i - 1);
}

运行结果:

3.递归应用2--斐波那契数列
  定义:一个数列的第0项是0,第1项是1,数列后的其他项是前两项数值之和。

含10个元素的斐波那契数列为:0,1,1,2,3,5,8,13,21,34
递归C语言实现:
#include <stdio.h>

int fibonaci(int i);

int main(){
	int i;
	
	for(i = 0; i < 10; i++){
		printf("%d\t\n", fibonaci(i));
	}
	
	return 0;
}

int fibonaci(int i){
	if(i == 0){
		return 0;
	}
	if(i == 1){
		return 1;
	}
	return fibonaci(i - 1) + fibonaci(i - 2);
}
运行结果:

4.递归应用3——汉诺塔问题(递归应用经典问题,能明白汉诺塔问题,递归就算理解了)
   来源(百度百科):汉诺塔(又称河内塔)问题是源于印度的一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 
    从上易知汉诺塔问题需遵循三个规则:
 (1)同一根柱子上从下到上圆盘的直径依次减小。
 (2)每一次只能移动一个圆盘。
 (3)每次移动只能从最上面的圆盘移动。

解:(1)n == 1

             第1次  1号盘  A---->C      sum = 1 次

           (2) n == 2

             第1次  1号盘  A---->B

             第2次  2号盘  A---->C

             第3次  1号盘  B---->C        sum = 3 次

     (3)n == 3

        第1次  1号盘  A---->C

        第2次  2号盘  A---->B

        第3次  1号盘  C---->B

        第4次  3号盘  A---->C

        第5次  1号盘  B---->A

        第6次  2号盘  B---->C

        第7次  1号盘  A---->C        sum = 7 次
不难发现规律:1个圆盘的次数 2的1次方减1

       2个圆盘的次数 2的2次方减1

              3个圆盘的次数 2的3次方减1

                     。  。   。    。   。   。

                         n个圆盘的次数 2的n次方减1
故:移动次数为:2^n - 1
递归C语言实现:
#include <stdio.h>

void Move(char x, char y){
    printf("%c -> %c\n", x, y);
}

void Hanoi(int n, char one, char two, char three){
	if(1 == n){
		Move(one, three);
	}
	else{
		Hanoi(n - 1, one, three, two);
		Move(one, three);
		Hanoi(n - 1, two, one, three);
	}
}

int main(){
	void Hanoi(int n, char one, char two, char three);
	int m;
	printf("input the number of disks:");
	scanf("%d", &m);
	printf("The step to move %d diskes:\n", m);
	Hanoi(m, 'A', 'B', 'C');
}
运行结果:


Python递归函数详解:从斐波那契数列到阶乘计算 递归是编程中一种通过函数自我调用来分解复杂问题的技术,通常包含基准条件和递归条件。递归在实现阶乘和斐波那契数列等经典问题时简洁直观,但存在栈空间使用大、性能较慢等问题。递归与迭代相比,代码复杂度低但性能较差,且受限于调用栈深度。递归优化技术包括记忆化、迭代转换和尾递归优化。递归在目录遍历、汉诺塔问题和分治算法(如快速排序)中有广泛应用。调试递归时可以使用打印递归深度和pdb调试工具。最佳实践包括明确基准条件、控制递归深度、考虑记忆化等。当递归不适用时,可以考虑显式栈、迭代法、动态规划和生成器等替代方案。 阅读详情

相关推荐

递归算法实验

算法设计与分析第二版的实验报告,熟悉环境和递归算法实验报告。

递归算法的总结与应用

一、步骤 把问题转化为规模缩小了的同类问题的子问题 有明确的不需要继续进行递归的条件(base case) 有当得到了子问题的结果之后的决策过程 不记录每一个子问题的解 二、实例 2.1 汉诺塔问题 打印n层汉诺塔从左边移动到最右边的全部过程 2.1.1 思路 不考虑左中右的情况。只考虑需要从源位置from移动到目标位置to,中间暂存的位置是help。那么问题就可以抽象为: 1~i-1:from - > help i :from - > to 1~i-1:help - &g

qfzhaohan的博客 965

递归算法总结

java递归算法。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

递归小结与递归分析

文章目录前言一、递归小结二、递归分析递归分析技巧:在求解递归方程时,我们可以忽视一些技术细节,它不会影响到最终的渐进结果。替换法直接猜测例子1解答减去低价项的例子去掉取整数的例子变量替换法递归树猜测注意每一层都是一样主定理主方法用于递归式注意的事,前提条件的满足总结 前言 递归的小结,优缺点,并且如何分析递归的时间复杂度:猜测数学归纳发,而猜测数学归纳又包括:直接猜测,递归树猜测,其中又包含着各种特殊情况要减去一点低阶项或者要合并上下取整,而除了猜测数学归纳法,还有主定理,主定理第三个还得注意前提条件

醉卧考场君莫笑 2707

Rocfall安装包&安装教程

Rocfall 第一步:下载安装包 下载路径: 链接:https://pan.baidu.com/s/1Dzvxzv67dSPRi7f7ZT9EeA 提取码:o9pl 第二部:安装 安装包解压 选择part1进行解压 点击Setup.exe启动安装 生成Serial Number 替换启动程序 安装完毕 素材来源于网络(禁止用于商业仅用于完成毕业设计和研究使用) 谢谢! ...

cym的博客 8702

Origin画图——获取论文图中数据

有时候需要已发表论文的图的数据,这里使用Origin软件取值,并且可以实现对图形再次画图。 Step 1. 打开origin软件,点击工具,图形数字化工具。 Step 2. 打开要获取数据的图片。拉动红蓝坐标,与图的坐标轴所贴合。 Step 3. 打开要获取数据的图片。拉动红蓝坐标,与图的坐标轴所贴合。 Step 3. 设置参数横轴起始坐标为300-900,纵轴为1.8-2.6. Step 4. 点击第五个手动取点,取出图中数据点。 Step 5. 依次对原图进行取点。点击项目资源查看图。

qq_42278015的博客 5183

利用递归求解阶乘和

题目内容: 输入一个10以内的整数n,计算1!+2!+…+n!的值,并输出该值。 输入格式: 10以内的一个整数 输出格式: 代表计算结果的一个整数 输入样例: 2 输出样例: 3 import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in=new...

jhx666的博客 798

ksz9031 mmd读取不了_ZYNQ. LwIP.PHY.KSZ9031RNX

新一块板子米尔科技的z-turn 使用的PHY芯片是Micrel的 KSZ9031RNX 而不是zedboard上的Marvell的。直接使用lwip的echo server demo时会报错 , 无法启动。在网上找了很久终于找到几篇关于这个问题的文章。修改PHY的驱动xemacpsif_physpeed.c文件该芯片的PHY Identifier 是 0x0022bsp设置中修改参数以提速MEM...

weixin_39626298的博客 924

C语言:利用递归函数求一个数的阶乘!

递归函数的定义: 编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。 小例子:求n的阶乘! #include&amp;lt;stdio.h&amp;gt; int fun(int a) { if(a&amp;lt;=1) return 1; return(a*fun(a-1)); } int main() { int a,b; printf(&quot;input a num:\...

段俊 3万+

载波同步技术(一):BPSK的Costas Loop 载波同步

Author:McCrocodile 2010/11/04          载波的提取在相干解调中往往比较重要,根据信号中是否包含载频分量,载波同步一般也可以分为两种方法。包含载频分量的可以采用窄带滤波或者基本的锁相环环路来实现,不包含的则比较麻烦需要采用特殊的环路实现载波的同步。这里介绍的BPSK的载波恢复就属于后面一种。 对于不包含载频分量的信号载波同步一般有:同相-正交环(就是常说的Costas环)、判决反馈环(几乎可以适用所有调制方式)、同相-正交环衍生环(QPSK松尾环、N相同相-正交环)。

McCrocodile Blog 1万+

线性代数学习笔记(十)——矩阵运算(二)

本篇笔记讲解矩阵的幂运算和矩阵的转置,其中矩阵进行幂运算的前提是矩阵为方阵,矩阵幂运算的两条性质与数的幂运算规则类似;矩阵转置的定义与行列式转置类似,但要注意由于矩阵的行数和列数不同,所以转置之后行数和列数变换。

li2008kui的专栏 1万+

递归算阶乘相加

1:1!+2!+3!+4!+5!+…(n-1)!+n!用代码算出来 public static void main(String[] args) throws IOException { //递归算阶乘相加 int i = demo9(10); System.out.println(i); } public static int demo9(int a) { //调用阶乘方法; i...

weixin_43187908的博客 2575

OpenStack [ compute_id ] 设计上的小缺陷

而 nova 代码中硬编码(或默认配置)将 compute_id 放在 site-packages 目录,属于 设计上的小缺陷—— 把 “库安装目录” 和 “运行时数据目录” 混在一起了,才导致需要临时调整这个目录的权限。# 配置项说明:node_identity_file 是 nova 用于指定节点标识文件路径的官方配置项,优先级高于代码中的默认路径。自定义 compute_id 路径,指向 /var/lib/nova/ 目录下的 compute_id 文件;

求知若渴,虚心若愚。 491

数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

目录递归介绍递归求阶乘递归求斐波那契递归解决汉诺塔总结 递归介绍 递归:就是函数自己调用自己。 子问题须与原始问题为同样的事,或者更为简单; 递归通常可以简单的处理子问题,但是不一定是最好的。 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作,只关心初始条件和上下层的变化关系。 递归函数需要有临界停止点,即递归不能无限制的执行下去。通常这个点为必须经过的一个数。 递归通常能被其他...

bigsai 1万+

如何学习总线技术

如何学习总线技术 以形象生动的比喻来描绘了总线技术的基本思想,指出了总线的基本分类和总线传输的基本原理,以及在学习过程中应当掌握的最基本的知识,对初学者有起到抛砖引入的作用。 0引言   如果一座只能容一个人来往的独木桥,两端的人都想要过桥,为了不拥挤、阻塞,那我们就得采取有效的办法。比如规定某段时间哪端的人过桥,另一端的人就等着该他过桥的时间段的到来,同时也还可以规定人多时要按先来后到或年

ce123的技术博客 8528

RK+linux教程:RK3588 RGA硬件加速在YOLOv5图像预处理中的深度应用教程

摘要: 本教程深入解析了RK3588芯片的RGA硬件加速器在YOLOv5图像预处理中的应用。通过专用硬件设计,RGA支持图像缩放、边界填充等核心操作,结合零拷贝技术显著提升处理效率。重点分析了LetterBox算法的RGA实现,包括参数计算、边界填充和性能优化,并与传统CPU处理对比,展示了RGA在高分辨率图像处理中的优势。教程还提供了统一的预处理接口设计,便于在OpenCV与RGA方案间灵活切换,为RK3588平台的深度学习部署提供实用优化方案。

LXY_LOVE36的博客 977

Python基础——递归及其经典例题(阶乘、斐波那契数列、汉诺塔)

Python中的递归问题,包括阶乘、斐波那契数列和汉诺塔问题

薛定谔的猫的博客 9953

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python 算法之递归与尾递归,斐波那契数列以及汉诺塔的实现

文章目录递归概念递归要素递归与迭代的区别示例一:阶乘示例二:斐波那契数列示例三:汉诺塔问题尾递归Python 中尾递归的解决方案 递归概念 递归:程序调用自身的编程技巧称为递归( recursion)。用一种通俗的话来说就是自己调用自己,它通常把一个大型复杂的问题层层转化为一个与原问题相似的、但是规模较小的问题来求解,当问题小到一定规模的时候,需要一个递归出口返回。递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。 递归

BOB'S BLOG 2305

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

求n的阶乘的算法框图_递归算法详解—图解阶乘、斐波那契数列、汉诺塔

递归介绍递归:就是函数自己调用自己。 子问题须与原始问题为同样的事,或者更为简单;递归通常可以简单的处理子问题,但是不一定是最好的。对于递归要分清以下概念:自己调用自己递归通常不在意具体操作,只关心初始条件和上下层的变化关系。递归函数需要有临界停止点,即递归不能无限制的执行下去。通常这个点为必须经过的一个数。递归通常能被其他方案替代(栈、数组正向求)。认识递归,递归函数通常简易但是对于初学者可能很...

weixin_39836860的博客 3749

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

图解递归—从阶乘、斐波那契到汉诺塔

递归介绍 递归:就是函数自己调用自己。 子问题须与原始问题为同样的事,或者更为简单; 递归通常可以简单的处理子问题,但是不一定是最好的。 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作,只关心初始条件和上下层的变化关系。 递归函数需要有临界停止点,即递归不能无限制的执行下去。通常这个点为必须经过的一个数。 递归通常能被其他方案替代(栈、数组正向求)。 认识递归,递归函数通常简...

weixin_30237719的博客 1523

java中递归算法原理及 阶乘,求和,斐波那契数,汉诺塔,代码实现

递归算法的理解: 递出去问题,层层调用得出结果,依次归还结果! 原理: 在方法中,调用自身 把问题一步一步地简化,简化到最简问题,再倒推求出结果 条件: 必须有一个明确的结束条件.否则不能用此方法; 太复杂的问题不建议用递归.效率低,内存容易溢出; 代码实现: 1.求阶乘 public class Test01{ public static void main(String[] a...

奋斗中的小码农博客 1180

c++中的阶乘(Factorial),斐波那契数列(Fibonacci Sequence)和汉诺塔(Tower of Hanoi)

hello大家好啊,我是文宇,不是文字,是文宇哦。今天的第一更,还有一更。

文宇的博客 3661

斐波那契递归调用次数_递归算法详解—图解阶乘、斐波那契数列、汉诺塔

递归介绍递归:就是函数自己调用自己。 子问题须与原始问题为同样的事,或者更为简单;递归通常可以简单的处理子问题,但是不一定是最好的。对于递归要分清以下概念:自己调用自己递归通常不在意具体操作,只关心初始条件和上下层的变化关系。递归函数需要有临界停止点,即递归不能无限制的执行下去。通常这个点为必须经过的一个数。递归通常能被其他方案替代(栈、数组正向求)。认识递归,递归函数通常简易但是对于初学者可能很...

weixin_39836536的博客 1549

算法:递归的理解(斐波那契与汉诺塔)

return 1;

2401_82613900的博客 1538

动图 汉诺塔_递归算法详解—图解阶乘、斐波那契数列、汉诺塔

递归介绍递归:就是函数自己调用自己。 子问题须与原始问题为同样的事,或者更为简单;递归通常可以简单的处理子问题,但是不一定是最好的。对于递归要分清以下概念:自己调用自己递归通常不在意具体操作,只关心初始条件和上下层的变化关系。递归函数需要有临界停止点,即递归不能无限制的执行下去。通常这个点为必须经过的一个数。递归通常能被其他方案替代(栈、数组正向求)。认识递归,递归函数通常简易但是对于初学者可能很...

weixin_31220401的博客 1233

Java通过递归方式实现数的阶乘,斐波那契数列与汉诺塔

何为递归算法 所谓递归,通俗易懂的理解就是自己直接或者间接的调用自己来实现一些复杂的操作; 自己调用自己?那不一直调用变成死循环了嘛?别急,如果我们提前定义好了出口,等到出口那里就终止调用,这样就可以完美解决死循环的问题了。 下面通过递归算法求阶乘与汉诺塔两个小例子来熟悉下递归的思想。 1.计算阶乘 当求第n个数的阶乘的时候,我们只需要知道n-1的阶乘即可,通过n*(n-1)就可以求出n的阶乘; public static void main(String[] args) { S

qq_34357351的博客 393
上一篇: 快速学习一门技术的逻辑
下一篇: 关于算法的时间复杂度和空间复杂度的总结
LAMYOO
博客等级 码龄10年 19粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值