一、什么是递归算法

   递归即递推+回归。递归算法是把问题转化为规模缩小了的同类子问题,然后递归调用函数(或过程)来表示问题的解。

二、递归算法的特点

  1.必须有 递归函数 + 递归出口

  2.递归算法解题通常显得简洁,但效率较低且系统通过栈来储存每一层的返回点、局部变量,递归次数过多容易造成栈溢出

三、如何编写递归函数

  例:Hanoi 塔(问题内容不再赘述)

    我们以三个圆盘(从小到大依次成为1,2,3号)三根柱子(A,B,C)为例:

    

  

    想要将 3号 移至C柱

       step1.  借助C把1、2号盘移到B;      

       step2.  将3号盘移至C;  

    

     想要将 2号  移至 C 柱 则用上述同样的思想     (递归函数的内涵所在,将大问题逐个分解为相同小问题)

         step1. 借助C 将 1号盘 移至 A柱 /*这里可以直接将 1号盘移至A,但如果 B盘上不止一个盘则需要借助C ,我这里是 按整体规律来写*/

             step2.  将 2号盘 移至 C;

    

    

    最后将 1号盘 移至 C柱

    

Hanoi塔 解题步骤:

1.将 A 上 n-1 个盘子移到B (借助C)

2.把 A 上 剩下的盘子移到C

3.将 n-1 个盘子从B 移到 C (借助A)

!!!

不用死记A B C在各个盘移动时的站位,将他们想成

初始柱  过渡柱  目标柱  这样在敲代码时思路会清晰一些

代码实践:

#include<iostream>
using namespace std; void move(char x1, char x2) {
cout << x1 << "-->" << x2 << endl;
} //A、B、C三个位置依次对应 初始柱/ 过渡柱/ 目标柱【是对应的位置对应各种柱子(初始、过渡、目标柱) 不是ABC字母对应】
void hanoi(int n, char A, char B, char C) { if (n == )
move(A, C);
else {
hanoi(n - , A, C, B); //A为初始柱 C为过渡柱 B为目标柱
move(A, C);
hanoi(n - , B, A, C); //B为初始柱 A为过渡柱 C为目标柱
}
} int main() {
cout << "输入盘子数: ";
int p;
cin >> p;
char A = 'A', B = 'B', C = 'C';
hanoi(p, A, B, C);
return ;
}

----------------------------------------------------小分割线----------------------------------------------

注意递归算法的两个必要条件递归出口和递归函数

认真分析如何将大问题分解为子问题    

这些需要多加练习~

==============================大分割线=========================

如有错误还是希望评论指正 :)

    

c++递归函数的更多相关文章

  1. javascript中的递归函数

    正常的递归函数如下: function factorial(num){ ){ ; }else{ ); } } 这个函数表面看起来还ok,但如果我们执行下面代码就会出错. var jenny = fac ...

  2. JS函数相关及递归函数的使用

    JS函数相关及递归函数的使用 通用js程序: function 函数名(参数列表) { 函数体 } 可使用alert()输出,也可用return返回值. alert与return区别: functio ...

  3. python3--函数(函数,全局变量和局部变量,递归函数)

    1.1函数 1.1.1什么是函数 函数就是程序实现模块化的基本单元,一般实现某一功能的集合.函数名:就相当于是程序代码集合的名称参数:就是函数运算时需要参与运算的值被称作为参数函数体:程序的某个功能, ...

  4. Python之路 day3 递归函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 在函数内部,可以调用其他函数.如果一个函数在内 ...

  5. Python3学习(二)-递归函数、高级特性、切片

    ##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...

  6. 浅谈-js递归函数

    所谓的递归函数就是在函数体内调用本函数.使用递归函数一定要注意,处理不当就会进入死循环.递归函数只有在特定的情况下使用 ,比如阶乘问题 下面我们就做一个10以内的阶乘试试看吧: [Ctrl+A 全选 ...

  7. Codevs 1910递归函数

    1910 递归函数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 对于一个递归函数w(a, b, c). 如果a <= ...

  8. codevs1910 递归函数

    难度等级:黄金 codevs1910 递归函数 题目描述 Description 对于一个递归函数w(a, b, c). 如果a <= 0 or b <= 0 or c <= 0就返 ...

  9. js中递归函数的使用介绍

    所谓的递归函数就是在函数体内调用本函数.使用递归函数一定要注意,处理不当就会进入死循环.递归函数只有在特定的情况下使用 ,比如阶乘问题 递归函数是在一个函数通过名字调用自身的情况下构成的,如下所示: ...

  10. 【Python】[函数] 函数的参数与递归函数

    一.函数的参数1.位置参数2.默认参数 n就是默认参数 def power(x,n=2): s=1 while n > 0: n = n - 1 s = s * x return s 默认参数有 ...

随机推荐

  1. (尚019)Vue基于脚手架编写项目

    vue_demo目录结构截图: (1)图一 (2).图二 (3).图三 (四).图四 (5).图五 (6).图六 (7).图七 不能随便改入口文件的名字,因为已经配置好了 (8).图八 (9).图九 ...

  2. Centos 不重启 修改ulimit参数

    1. 查看limits.conf文件 cat /etc/security/limits.conf 2. 打开编辑limits.conf文件 sudo vim /etc/security/limits. ...

  3. A simple dispiction of dijkstra

    前言 \(SPFA\)算法由于它上限 \(O(NM) = O(VE)\)的时间复杂度,被卡掉的几率很大.在算法竞赛中,我们需要一个更稳定的算法:\(dijkstra\). 什么是\(dijkstra\ ...

  4. 安卓入门教程(十三)-Activity

    已经发表个人公众号 什么是Activity? Android是由Activity,Service,Content,Provider等组件组成,其中要讲的就是Activity组件,这是最基本,且常用的组 ...

  5. HttpClient 发送请求和参数

    发送请求 没有参数 private static void getData() { String timeStamp = String.valueOf(System.currentTimeMillis ...

  6. fluent加载第三方(C++,Fortan等)动态链接库

    这里我介绍一种比较简单的方法,首先我们从ANSYS Fluent UDF Manual上随便找一段正确的UDF,下面这段UDF取自ANSYS 18的ANSYS Fluent UDF Manual,位于 ...

  7. SSH框架整合2

    ===========================================web.xml================================================== ...

  8. Spring Boot 支持 HTTPS 如此简单,So easy!

    这里讲的是 Spring Boot 内嵌式 Server 打 jar 包运行的方式,打 WAR 包部署的就不存在要 Spring Boot 支持 HTTPS 了,需要去外部对应的 Server 配置. ...

  9. python使用ldap3进行接口调用

    把自己使用到的ldap调用的代码分享出来,希望大家可以参考 #!/usr/bin/python # -*- coding: utf-8 -*- """ @Time : 2 ...

  10. Android - Button(按钮)的响应点击事件的4种写法

    Button控件setOnclickListener(View.OnClickListener listener)来接收一个点击事件的监听器 自定义一个点击事件监听器类让其实现View.OnClick ...