zoukankan      html  css  js  c++  java
  • 算法思想篇(3)————递归算法

    在计算机编程应用中,递归算法对解决大多数问题是十分有效的,它能够使算法的描述变得简洁而且易于理解。递归算法有如下3个特点。
    (1)递归过程一般通过函数或子过程来实现。
    (2)递归算法在函数或子过程的内部,直接或者间接地调用自己的算法。
    (3)递归算法实际上是把问题转化为规模缩小了的同类问题的子问题,然后再递归调用函数或过程来表示问题的解。
    在使用递归算法时,读者应该注意如下4点。
    (1)递归是在过程或函数中调用自身的过程。
    (2)在使用递归策略时,必须有一个明确的递归结束条件,这称为递归出口。
    (3)递归算法通常显得很简洁,但是运行效率较低,所以一般不提倡用递归算法设计程序。
    (4)在递归调用过程中,系统用栈来存储每一层的返回点和局部量。如果递归次数过多,则容易造成栈溢出,所以一般不提倡用递归算法设计程序。
    下面两个例子说明递归算法的思想:
    (1)汉诺塔问题:
    代码如下:

    //start from the very beginning,and to create greatness
    //@author: Chuangwei Lin
    //@E-mail:979951191@qq.com
    //@brief: 汉诺塔
    #include <stdio.h>
    /******************************************************
    函数名:move(int n,char x,char y,char z)
    参数:个数,柱子编号
    功能:移动函数
    *******************************************************/
    void move(int n,char x,char y,char z)
    {
       if (n==1)
          printf("%c-->%c
    ",x,z);//若只有1个,则直接移动,结束条件
       else
       {
          move(n-1,x,z,y);//借助第三根移动到第二根
          printf("%c-->%c
    ",x,z);//自己移动最后一个盘
          move(n-1,y,x,z);//借助第1根移动到第三根
       }
    }
    void main()
    {
       int number;
       printf("输入盘子个数: ");
       scanf("%d",&number);
       printf("移动%2d 个盘子的步骤如下:
    ",number);
       move(number,'a','b','c');//开始移动
    }
    
    

    运行结果:
    这里写图片描述
    (2)阶乘问题:
    代码如下:

    //start from the very beginning,and to create greatness
    //@author: Chuangwei Lin
    //@E-mail:979951191@qq.com
    //@brief: 阶乘
    #include <stdio.h>
    int fact(int n);//计算函数
    int main()
    {
        int i;
        printf("输入要计算阶乘的一个整数:"); 
        scanf("%d",&i);
        printf("%d的阶乘结果为:%d
    ",i,fact(i)); //递归调用
        return 0;
    }
    int fact(int n)//递归子函数
    {
        if(n<=1)//0!=1,1!=1
            return 1;
        else
           return n*fact(n-1);
    }
    

    运行结果:
    这里写图片描述

  • 相关阅读:
    Qt音视频开发11-ffmpeg常用命令
    Qt音视频开发10-ffmpeg控制播放
    Qt音视频开发9-ffmpeg录像存储
    Intellij IDEA 与maven 版本不符 Unable to import maven project See logs for details: No implementation for org.apache.maven.model.path.PathTranslator was bound
    Java Map 遍历史上最全
    java new date 结果与操作系统时间相差8小时处理解决方法
    elasticsearch报错
    Pytorch-基于Transformer的情感分类
    Pytorch-LSTM+Attention文本分类
    PHP FFI调用go,居然比go还快
  • 原文地址:https://www.cnblogs.com/sigma0-/p/12630509.html
Copyright © 2011-2022 走看看