问题:有n步台阶,一次只能上1步或2步,共有多少种走法?

解法:

(1)递归

(2)循环迭代

递归

注:对于每一种我们只关心他最后一步的两种可能,一种是还差一步,一种是还差两步,这两种可能相加就可以(关心他最后是 一步跨两个台阶 还是 一步跨一个台阶。

  解释:假设当n=3时,他跨完所有台阶有两种情况,一种是最后一次是踏一步踏完台阶,另一种是最后一次踏两步踏完台阶,图中n=3时的两种情况就是如此。

        图中演示的并不是

第一种情况:踏一步-踏一步-踏一步-踏完

第二种情况:踏一步-踏两步-踏完

第三种情况:踏两步-踏一步-踏完

        n=1时有多少种走法,n=2时有多少种走法,这两种加起来就是n=3时有多少种走法。f(2)里包含了f(1),f(n)最后一次的走法往前推,最后一次的走法要么是n-1步,要么是n-2步。即要么走一步要么走2步,由此引入f(n-1)和f(n-2),f(n)=f(n-1)+f(n-2),由大往小调,大的不断调用小的,一步一步往前推。

代码如下:

package org.example.step;import org.junit.Test;public class TestStep{@Testpublic void test(){long start = System.currentTimeMillis();System.out.println(f(100));//165580141long end = System.currentTimeMillis();System.out.println(end-start);//586ms}//  实现f(n):求n步台阶,一共有几种走法//  f(n)=f(n-1)+(n-2)public int f(int n){if(n<1){throw new IllegalArgumentException(n + "不能小于1");}if(n==1 || n==2){return n;}return f(n-2) + f(n-1);}
}

循环迭代:

注:one和two作为变量把状态保存了,两种方法看似相同,很大不同。递归是倒推,大的不断往前得到小的。循环迭代是顺推,小的累积得到大的。

代码如下:

package org.example.step;import org.junit.Test;public class TestStep2 {@Testpublic void test(){long start = System.currentTimeMillis();System.out.println(loop(100));//165580141long end = System.currentTimeMillis();System.out.println(end-start);//<1ms}public int loop(int n){if(n<1){throw new IllegalArgumentException(n + "不能小于1");}if(n==1 || n==2){return n;}/** 对于下面两行结合图来看,图中显示  two = f(1); one = f(2)* f(1)指跨1步,f(2)指跨2步* */int one = 2;// 初始化为到达共3级台阶跨2步台阶还差1步台阶的走法(初始化为走到第二级台阶的走法--原文)int two = 1;// 初始化为到达共3级台阶跨1步台阶还差2步台阶的走法(初始化为走到第一级台阶的走法--原文)// 定义一个参数,赋值0仅是初始化一下int sum = 0;for(int  i=3; i<=n; i++){// 最后跨2步 + 最后跨1步的走法sum = two + one;// two = n-1 时的one,one = n-1 时的sumtwo = one;one = sum;}return sum;}
}

对于上面两种方法的总结:

(1)递归相较于循环迭代效率低,但简洁易懂;循环迭代相较于递归效率高,但稍微复杂一些,且不易理解。

(2)两种方法看似相同,很大不同。递归是倒推,大的不断往前得到小的。循环迭代是顺推,小的累积得到大的。

递归与迭代,台阶问题,斐波那契,分治算法相关推荐

  1. php猴子吃桃子问题n天,『PHP学习笔记』系列四:利用函数递归调用思想解决【斐波那契数列】问题和【猴子吃桃问题】问题...

    什么是函数递归思想? 递归思想:把一个相对复杂的问题,转化为一个与原问题相似的,且规模较小的问题来求解. 递归方法只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量. 但在 ...

  2. 斐波那契查找算法解析

    文章目录 前言 一.斐波那契数列 二.斐波那契查找算法 前言 学数据结构的时候被斐波那契查找算法困扰,刚开始难以理解,脑袋有点懵,翻看了许多大佬的博文,加上自己的理解发了出来 一.斐波那契数列 我们先 ...

  3. PHP 算法之斐波那契数列算法 计算出生兔子的数量

    <斐波那契数列算法> 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 分析:一对兔子也 ...

  4. C++以字符串形式返回第N个斐波那契的算法(附完整源码)

    C++以字符串形式返回第N个斐波那契的算法 C++以字符串形式返回第N个斐波那契的算法完整源码(定义,实现,main函数测试) C++以字符串形式返回第N个斐波那契的算法完整源码(定义,实现,main ...

  5. 查找算法:斐波那契查找算法实现及分析

    斐波那契查找算法介绍 斐波那契查找法肯定与斐波那契相关嘛,斐波那契数列 又称黄金分割数列.所以我们先把黄金分割弄懂,后面代码才能看得懂!黄金分割点大家都知道吧.1:0.618或者1.618:1,我们的 ...

  6. 查找算法之斐波那契查找算法

    斐波那契(黄金分割法)查找算法 (一)算法简介 (1)斐波那契数列 在讲算法之前,我们先介绍一下斐波那契数列,该数列公式为F(K) = F(k-1) + F(k-2),即 1.1.2.3.5.8.13 ...

  7. 007.斐波拉契查找算法

    1. 斐波拉契查找算法 斐波拉契查找算法也称为黄金分割查找算法,它是在折半查找算法的基础上根据斐波拉契数列进行分割.折半法是取排序好的中间值进行分割,而斐波拉契查找算法是根据黄金分割点进行分割. 黄金 ...

  8. 【数据结构与算法】插值查找算法、斐波那契查找算法(黄金分割法)的介绍和程序实现

    目录 1. 插值查找算法 1.1 插值查找算法的介绍 1.2 插值查找算法的程序实现 2. 斐波那契查找算法 2.1 斐波那契查找算法的介绍 2.2 斐波那契查找算法的程序实现 1. 插值查找算法 1 ...

  9. 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)

    递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...

  10. python斐波那契前20递归_算法python实现经典递归问题(汉诺塔, 斐波那契数列,阶乘)...

    经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘.寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这些盘子移动完毕,世界就会灭亡.这个传说叫做梵天寺之塔问题( ...

最新文章

  1. .NET企业级应用架构设计系列之应用服务器
  2. 5130S-52S-PWR-HI 堆叠配置
  3. Luogu P1967 NOIP2013 货车运输
  4. linux 防火墙开启1521端口,linux防火墙开放1521端口
  5. BZOJ3110: [Zjoi2013]K大数查询
  6. springcloud 文件服务器,SpringCloud传文件
  7. python多线程下载器_用 python 实现一个多线程网页下载器
  8. Android 扫描二维码demo
  9. LeetCode 2059. 转化数字的最小运算数(BFS)
  10. 小米11终于来了,12月28日见!
  11. npm 更新依赖 / 更新库 / 更新包 的命令 | npm outdated | npm updated
  12. php url 合法字符串_PHP函数补完:http_build_query()构造URL字符串
  13. 2020最常用的8个代码编辑器推荐
  14. tensorflow搭建神经网络
  15. C++Qt开发-单线程实现生命游戏
  16. Java加密体系结构(JCA)参考指南
  17. Springboot源码解读
  18. 化工原理少学时答案解析_化工原理(少学时)题库 及答案
  19. phpstudy 本地配置url重写
  20. 视频格式转换器下载哪个好?分享:3种TS到MP4的转换器

热门文章

  1. python打开图片出错 IOError: cannot identify image file 解决方法
  2. windows系统锁定计算机组合键,WIN键间断性触发在锁定状态!!
  3. shiro登陆错误回顾
  4. activiti学习(二十一)——流程虚拟机源码分析(三)——从进入到离开userTask
  5. Spring实战 第1章 Spring之旅
  6. 基于WMI获取USB设备信息(即获取插即用设备信息)System.Management.ManagementObjectSearcher--ManagementObjectCollection
  7. 【20180615】【射频通信】RF、IF、Baseband的区别,PLL和VCO的定义,I/Q信号的定义
  8. word 全部更新域
  9. 一加7充电_一加7T充电、续航能力测评
  10. Pnp即插即用设备驱动 自动安装程序 C C++实现