zoukankan      html  css  js  c++  java
  • 递归函数

    假如一个函数或子程序,是由自身所定义或调用的,就称为递归。递归至少要定义两种条件:一个是可以反复执行的递归过程,和一个跳出执行过程的出口。

     汉诺塔问题

      说是在古印度神庙,庙中有3根木桩,天神希望和尚们把某些数量大小不同的盘子,从第一个木桩全部移到第三个木桩。即假设有a,b、c三个木桩和n个大小不相同的盘子,从小到大编码为1、2、3...n,编号越大,直径越大,开始的时候,n个盘子都放在木桩a上,现在希望能找到将木桩a上的盘子借着木桩b当桥梁,全部移到木桩c上的最少次数的方法(直径小的盘子永远只能放在直径大的盘子的上面;盘子可以任意移动到其他木桩上;每次只能移动一个盘子)。分析汉诺塔问题可以发现,它满足了递归的两大特点:1,有反复执行的过程;2,有停止的出口。

      汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b。第二,把a上的最下面的盘移到c。第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。用代码实现为

    function hanoi(n,p1,p2,p3){
        if(n==1){//递归出口
            console.log("盘子从"+p1+"移动到"+p3);
        }else{
            hanoi(n-1,p1,p3,p2)
            console.log('~盘子从'+p1+'移动到'+p3)
            hanoi(n-1,p2,p1,p3)  
        }
    }
    
    let hanoi = (n,p1,p2,p3) => {
      if(n==1){
        console.log("盘子从"+p1+"移动到"+p3);
      }else{
        hanoi(n-1,p1,p3,p2)
        console.log('~盘子从'+p1+'移动到'+p3)
        hanoi(n-1,p2,p1,p3)
      }
    }

    斐波拉契数列

    斐波拉契数列的基本定义是,一个数列的第零项是0,第一项是1,这个数列其他后续的值是前面两项的数列之和。同样符合递归的两个特征。

    function factorial(i){
      if(i==0){//跳出执行过程的出口
        return 0;
      }else if(i==1){
        return 1;
      }else{
        return factorial(i-1)+factorial(i-2);
      }
    }
    let factorial = (i) => {
      if(i==0){//跳出执行过程的出口
        return 0;
      }else if(i==1){
        return 1;
      }else{
        return factorial(i-1)+factorial(i-2);
      }
    }
  • 相关阅读:
    【已解决】对发现无理数过程的逻辑严谨性的疑惑
    微积分奇观之计算曲线的平均高度
    闲鱼二维码 另外那个号
    联通KD-YUN-811G光猫管理员密码
    人工智能结课作业-BP神经网络/卷积神经网络手写体识别
    人工智能结课作业-遗传算法/粒子群寻优/蚁群算法解决TSP问题
    人工智能结课作业-DFS/BFS/Astar解决八数码问题
    AMD 2020显卡驱动没有切换独立显卡选项
    linux创建文件夹快捷方式
    Ubuntu 18.04 设置开机启动脚本
  • 原文地址:https://www.cnblogs.com/web-fengmin/p/6664563.html
Copyright © 2011-2022 走看看