经典递归——斐波那契数列,汉诺塔
斐波那契
汉诺塔
0 1 1 2 3 5 8 13 21
int fibonacci(int a){if(a==0)return 0;else if(a==1)return 1;elsereturn fibonacci(a-1)+fibonacci(a-2); }
我也来搞一下这个 汉诺塔的调调:
先来讲一下这个 东西怎么玩儿
需要做的事情是把 1针上的盘子都放到3针上面。
要求每次只能移动一个盘子,并且只能是大盘子在下,小盘子在上,对于每两个盘子来说。
所以为了实现这一目的
Step1: 把1针上的最后一个盘子放到3针上面。//移动
【前提:这样就需要先把n-1盘子放到2针上面。 也就是Step0:】
Step0:这样就需要先把n-1盘子放到2针上面。//逻辑
//对于代码,这句话本质上相当于 2针是目标,也就是 2针上是需要盛盘子的针。所以2针是目的针,要把n-1个盘子从1针放到2针上,借助3针,所以abc三根针的关系在hanoi(n,a,b,c)的本质是:a作为移出针,b作为借助针,c作为目标针。所以 这里面这句话应该写作:hanoi(n-1,a,c,b);
Step1:
Step2:前提把n-2个盘子放到1针上。//逻辑
所以从2针出来,放到1针上,借助,3针。这几个参数就是213.
Step3:把2针上的最后一个盘子放到3针上。//移动
然后 把n-3个盘子放到2针上面,也就是 Step0:
然后再 Step1
所以 大概是这样的:
void hanoi(int n,int a,int b,int c){ if(n==1) printf("%d -> %d \n",a,c);//移动 else{hanoi(n-1,a,c,b);printf("%d -> %d \n",a,c);//移动 hanoi(n-1,b,a,c);} }
运行结果:
代码:
/**#include <iostream>int fibonacci(int); void hanoi(int n ,int a,int b, int c);int main(int argc, char** argv) {//printf("%d",fibonacci(1));hanoi(3,1,2,3);return 0; }void hanoi(int n,int a,int b,int c){if(n==1) printf("%d -> %d \n",a,c);//移动 else{hanoi(n-1,a,c,b);printf("%d -> %d \n",a,c);//移动 hanoi(n-1,b,a,c);}} /**返回第a个数的大小,从0开始。 */ int fibonacci(int a){if(a==0)return 0;else if(a==1)return 1;elsereturn fibonacci(a-1)+fibonacci(a-2); }*/
试试4个的:
大概那眼睛移动了一下,应该是没有问题的。
再来回顾一下代码:
/**n代表要移动的盘子的个数。 a 代表从哪跟针往外移出。 移出针 b代表借助哪跟针。 借助针 c代表要移动到哪根针。 目的针 */ void hanoi(int n,int a,int b,int c){if(n==1) printf("%d -> %d \n",a,c);//移动 else{hanoi(n-1,a,c,b);//逻辑 printf("%d -> %d \n",a,c);//移动 hanoi(n-1,b,a,c);//逻辑 } }
如果只有一个盘子,就把盘子直接从1移动到3.
否则就把n-1个盘子移动到2.
然后把盘子放到3上。
再把剩下的盘子从2移到3上。
应该可以开始默写了
Hanoi(int n,int from,int rent,int destination){If(n==1) printf("%d -> %d",from,destination);Else{Hanoi(n-1,from,destination,rent);Printf("%d ->%d",from,destination);Hanoi(n-1,rent,from,destination); }
不看还是会忘的。总之这就是这么个事儿,算法么~大都是背下来的。哪有那么多真正会的人。。。
以下源代码:
#include <iostream>int fibonacci(int); void hanoi(int n ,int a,int b, int c);int main(int argc, char** argv) {//printf("%d",fibonacci(1));hanoi(4,1,2,3);return 0; }/**n代表要移动的盘子的个数。 a 代表从哪跟针往外移出。 移出针 b代表借助哪跟针。 借助针 c代表要移动到哪根针。 目的针 */ void hanoi(int n,int a,int b,int c){if(n==1) printf("%d -> %d \n",a,c);//移动 else{hanoi(n-1,a,c,b);//逻辑 printf("%d -> %d \n",a,c);//移动 hanoi(n-1,b,a,c);//逻辑 } }/**返回第a个数的大小,从0开始。 */ int fibonacci(int a){if(a==0)return 0;else if(a==1)return 1;elsereturn fibonacci(a-1)+fibonacci(a-2); }
转载于:https://www.cnblogs.com/letben/p/5216713.html
经典递归——斐波那契数列,汉诺塔相关推荐
- 数据结构Java02【栈、队列、单链表(增删节点)、循环链表、双向循环链表、递归(斐波那契、汉诺塔)】
学习地址:[数据结构与算法基础-java版]
- 两个经典递归问题:菲波那契数列 + 汉诺塔
一.递归问题的处理步骤 1)抽象出递归公式:对实际问题进行部分穷举,抽象出递归关系(关键),并列出"递归表达式" 2)确定递归出口:找出递归调用终止点 二.菲波那契数列 实际问题: ...
- 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...
- labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)
递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的. 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作 ...
- 递归算法小结(数的阶乘、斐波那契和汉诺塔问题)
递归是一项重要的编程技术,它让函数可以从函数体内部调用自身.递归通常把一个大型复杂的问题层层简化为一个,与原问题相似的规模较小的问题来求解,使用递归策略只需少量的程序就可描述出解题过程所需要的多次重复 ...
- html5斐波那契数列,经典的斐波那契数列与arguments.callee
经典的斐波那契数列与arguments.callee HTML5学堂:提到斐波那契数列,很多人还不是太清楚,但是如果提到兔子繁殖这个经典题目,相信学过计算机语言的人们会立刻感觉"亲切&quo ...
- python函数递归 斐波那契数列
4.7 python函数递归 斐波那契数列 代码:(利用递归.format输出等) def fibonacci(n):if n==1 or n==2:f=1else:f=fibonacci(n-1)+ ...
- 【数据结构】递归斐波那契数列的时间复杂度、空间复杂度
递归斐波那契数列的时间复杂度相对于循环等函数而言并不容易看出来,下面通过斐波那契数列的程序进行图解: long long Fib(size_t N) {if (N < 3)return 1;re ...
- Java实现递归 斐波那契数列 阶乘
Java实现递归 斐波那契数列 阶乘 阶乘 /*** 使用递归算法求阶乘* 求阶乘 * 5!=5*4*3*2*1; * * 1=1;* 2!=2*1!;* 3! = 3*2!;* 4! = 4*3!; ...
最新文章
- nginx加密,访问接口认证
- 计算机组成原理 位宽,数据总线宽度一般为存储单元位宽的整数倍 这怎么理解哦...
- vue 获取元素在浏览器的位置_JavaScript获取窗口位置和元素坐标(兼容版)
- 在Angular单个的单元测试里,调用多次detectChange,会重复执行ngAfterViewInit hook吗
- why I cannot get any search result from P8F
- java异步io_Java中的异步IO与异步请求处理
- python语法基础知识案例_Python 语法速览与实战清单
- C语言数据类型转换详解
- vue从入门到开发--4--处理http请求
- 47-点分十进制表示法
- LDO分压电阻计算小工具
- 程序员修炼之道——读序
- 跟着Cell学作图| 11.Ingenuity Pathway Analysis(IPA)
- 【STM32学习】(28)STM32实现光照度采集(标准库和HAL库实现)
- 安装 PS2017CC
- 详细浮点型数据的存储讲解
- com.alibaba.fastjson.JSONException: create instanc
- 1.天池金融风控-贷款违约预测新人赛之预备知识
- java socket demo及其缺点
- 测量人脸颜值的标准有哪些,人脸图像算法研究(2)
热门文章
- 敏捷DoD完成定义的多种形态
- MySQL工作中的实际用_数据库在工作中的应用,以及什么是MySQL?
- swoole mysql 并发_Swoole4 如何打造高并发的PHP7协程Mysql连接池?
- java 找不到mysql驱动_java lib目录添加了mysql驱动包,仍然找不到class??
- 企服创业必修课丨神策数据与红杉中国联合发布规模化营销获客体系建设指南...
- 神策数据陈宁:前端国际化技术需求及模型实现
- 官宣:神策数据证券行业解决方案,全新上线官网!
- 一个简易的webpack开发环境
- ASP NET 数据库访问
- XStream xml与javabean之间的互转