iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++递归与分治算法原理示例详解
  • 122
分享到

C++递归与分治算法原理示例详解

2024-04-02 19:04:59 122人浏览 八月长安
摘要

目录1. 汉诺塔问题2. 全排列问题3. 利用递归与分治策略寻找最大值4. 归并排序5. 快速排序6. 棋盘覆盖问题1. 汉诺塔问题   递归算法,分为 3 步:

1. 汉诺塔问题

 

递归算法,分为 3 步:将 n 个 a 上的盘子借助 c 移动到 b 

① 将 n-1 个 a 上的盘子借助 b 移动到 c

② 将 a 上的盘子移动到 b

③ 将 c 上的 n-1 个盘子借助 a 移动到 b

所有盘子都移动到 b 上了


void hanoi(int n,char a,char b,char c)//将n个碟子从a借助c 移到b
 { 
    if(n==0) 
    return; 
    else 
     { 
        hanoi(n-1,a,c,b); 
        move(a,b); 
        hanoi(n-1,c,b,a);
     }
}

2. 全排列问题

问题描述:设R={r1,r2,…,rn}是要进行排列的n个元素,求R的全排列Perm(R)。

算法思路:

① 从 n 个数中取出数列的第一个数,然后不断将数列中剩余的数与第一个数进行交换,计算剩余 n-1 个数的全排列。

② 对 n - 1 个数进行同样的递归操作,当交换的第一个数的下标 k 和 序列末尾的 m 相同时,说明前置所有数都已经交换完成,进行输出。

 ③ 递归结束后进行状态回调,保证不影响下一次递归的进行。


void Perm(int list[], int k, int m)
{
    if(k==m)
    {
        for(int i=0;i<m;i++)
        {
            cout<<list[i];
        }
        cout<<endl;
        return;
    }
    for(int i=k;i<m;i++)
    {
        swap(list[k], list[i])
        Perm(list, k+1, m)
        swap(list[k], list[i])
    }
}

3. 利用递归与分治策略寻找最大值


#include <bits/stdc++.h>
using namespace std; 
int find_max(int a[], int from, int to){ 
    if(from>=to) return a[from]; 
    int mid = (from + to)/2;
    int v1 = find_max(a, from, mid);
    int v2 = find_max(a, mid+1, to);
    if(v1<=v2) return v2;
    else return v1;
} 
int main()
{
    int n, a[100000];
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    cout<<find_max(a, 0, n-1);
}

4. 归并排序


#include <bits/stdc++.h> 
using namespace std;  
void merge_array(int a[], int from, int mid, int to){
 
    int tmp[100000], idx_tmp=0;
    int i,j;
    for(i=from, j=mid+1; i<=mid && j<=to;){
 
        if(a[i]<=a[j]) tmp[idx_tmp++] = a[i++];
        else tmp[idx_tmp++] = a[j++]; 
    }
    while(i<=mid) tmp[idx_tmp++]=a[i++];
    while(j<=to) tmp[idx_tmp++]=a[j++];
    for(int i=from,j=0; i<=to;i++) a[i] = tmp[j++]; 
}
 
void merge_sort(int a[], int from, int to){ 
    if(from < to){
        int mid = (from + to)/2;
        merge_sort(a, from, mid);
        merge_sort(a, mid+1, to);
        merge_array(a, from, mid, to);
    }
} 
int main()
{
    int n, a[100000];
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    merge_sort(a, 0, n-1);
    for(int i=0;i<n;i++){
        printf("%d ", a[i]);
    }
}

5. 快速排序

图解快速排序://www.jb51.net/article/113769.htm

递归 + 交换法 


#include <bits/stdc++.h> 
using namespace std; 
int sort_array(int a[], int from, int to)
{
    int base = a[from];
    int i,j;
    for(i=from, j=to; i<j;)
    {
        while(a[j]>=base && i<j) j--;
        while(a[i]<=base && i<j) i++;
        //function swap()
        if(i<j){
            int t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
    a[from]=a[i];
    a[i]=base;
    return i;
} 
void quick_sort(int a[], int from, int to)
{
    if(from>=to) return;
    int i = sort_array(a, from, to);
    quick_sort(a, from, i-1);
    quick_sort(a, i+1, to);
}
 
int main()
{
    int n, a[100000];
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    quick_sort(a, 0, n-1);
    for(int i=0;i<n;i++){
        printf("%d ", a[i]);
    }
}

6. 棋盘覆盖问题


#include <bits/stdc++.h> 
using namespace std; 
int num=0;
int a[1000][1000]; 
void make_chess(int px, int py, int tx, int ty, int sze){ 
    if(sze==1) return;
    num++;
    sze/=2;
 
    //左上
    if(px<tx+sze && py<ty+sze)
    {
        a[tx+sze-1][ty+sze]=num;
        a[tx+sze][ty+sze-1]=num;
        a[tx+sze][ty+sze]=num;
    }
 
    //右上
    if(px<tx+sze && py>=ty+sze)
    {
        a[tx+sze-1][ty+sze-1]=num;
        a[tx+sze][ty+sze-1]=num;
        a[tx+sze][ty+sze]=num;
    }
 
    //左下
    if(px>=tx+sze && py<ty+sze)
    {
        a[tx+sze-1][ty+sze-1]=num;
        a[tx+sze-1][ty+sze]=num;
        a[tx+sze][ty+sze]=num;
    }
    //右下
    if(px>=tx+sze && py>=ty+sze)
    {
        a[tx+sze-1][ty+sze-1]=num;
        a[tx+sze-1][ty+sze]=num;
        a[tx+sze][ty+sze-1]=num;
    }
 
    //左上
    if(px<tx+sze && py<ty+sze) make_chess(px, py, tx, ty, sze);
    else make_chess(tx+sze-1, ty+sze-1, tx, ty, sze);
 
    //右上
    if(px<tx+sze && py>=ty+sze) make_chess(px, py, tx, ty+sze,sze);
    else make_chess(tx+sze-1, ty+sze, tx, ty+sze,sze);
 
    //左下
    if(px>=tx+sze && py<ty+sze) make_chess(px, py, tx+sze, ty,sze);
    else make_chess(tx+sze, ty+sze-1, tx+sze, ty, sze);
 
    //右下
    if(px>=tx+sze && py>=ty+sze) make_chess(px, py, tx+sze, ty+sze, sze);
    else make_chess(tx+sze, ty+sze, tx+sze, ty+sze, sze); 
}
 
int main()
{
    int k, px, py;
    int tx=0, ty=0;
    cin>>k>>px>>py;
    make_chess(px-1, py-1, tx, ty, k);
 
    for(int i=0; i<k; i++){
        for(int j=0; j<k; j++){
            printf("%2d ", a[i][j]);
        }
        cout<<endl;
    } 
}

以上就是C++递归与分治算法原理示例详解的详细内容,更多关于C++递归与分治算法的资料请关注编程网其它相关文章!

--结束END--

本文标题: C++递归与分治算法原理示例详解

本文链接: http://www.lsjlt.com/news/156117.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++递归与分治算法原理示例详解
    目录1. 汉诺塔问题2. 全排列问题3. 利用递归与分治策略寻找最大值4. 归并排序5. 快速排序6. 棋盘覆盖问题1. 汉诺塔问题   递归算法,分为 3 步:...
    99+
    2024-04-02
  • 递归与分治算法练习
      最近刚学习算法设计与分析的课程,所用教材是清华大学出版社王晓东编著的《算法设计与分析》。一道关于递归与分治算法的练习题如下:  刚拿到题目觉得这题目似乎和递归分治没有什么关系,但是O(1)的空间复杂度,以及O(n)的时间复杂度度就限制了...
    99+
    2023-06-02
  • C++ 函数递归详解:分治法中的递归应用
    递归是一种函数自我调用的技术,适用于可分解成较小规模子问题的问题。分治法采用递归将问题分解成独立子问题,逐步解决。如 findmaximum() 函数递归查找数组中最大值,通过检查基本情...
    99+
    2024-05-03
    c++ 递归
  • C# 递归算法详解
    目录1)1、1、2、3、5、8.......用递归算法求第30位数的值?2)编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)斐波那契数列为:0、1、1、2、3、……...
    99+
    2024-04-02
  • 例题详解Java dfs与记忆化搜索和分治递归算法的使用
    目录一、dfs(深度优先搜索)1.图的dfs2.树的dfs二、记忆化搜索1.普通递归:O(2^n)2.记忆化搜索: O(n)三、分治四、算法题1.dia和威严 示例2.小红...
    99+
    2024-04-02
  • C++ 递归函数在分治算法中的应用?
    分治算法将大问题分解成较小子问题,c++++递归函数可实现分治算法:选择基准元素;分割数组为基准元素两侧;递归排序两部分;合并已排序部分。 C++ 递归函数在分治算法中的应用 分治算法...
    99+
    2024-04-19
    c++ 递归函数 分治算法
  • Python实例详解递归算法
    递归是一种较为抽象的数学逻辑,可以简单的理解为「程序调用自身的算法」。 维基百科对递归的解释是: 递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义...
    99+
    2024-04-02
  • C++ 函数递归详解:递归的定义和原理
    递归是一种函数调用自我的编程技术,通过将问题分解成较小问题、设置边界条件和递减问题来实现。以求斐波那契数列为例,递归函数使用边界条件(n ≤ 1)和递减问题(fib(n - 1) + f...
    99+
    2024-05-01
    函数 递归 c++
  • C++ 函数的递归实现:递归与非递归算法的比较分析?
    递归算法通过函数自调用解决结构化的问题,优点是简洁易懂,缺点是效率较低且可能发生堆栈溢出;非递归算法通过显式管理堆栈数据结构避免递归,优点是效率更高且避免堆栈溢出,缺点是代码可能更复杂。...
    99+
    2024-04-22
    c++ 递归 堆栈溢出
  • C++递归算法处理岛屿问题详解
    目录岛屿问题定义例题一-岛屿的数量例题二-岛屿的周长岛屿问题定义 岛屿问题是指用二维数组进行模拟, 1的位置表示陆地, 0的位置表示海洋。岛屿是指 被水(0)包围的陆地(1) 如下图...
    99+
    2024-04-02
  • 如何进行C#递归算法理解的分析
    如何进行C#递归算法理解的分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#递归算法的理解并不是紧紧感觉很好用,那么C#递归算法的使用是要用递归的思路去解决...
    99+
    2023-06-17
  • 怎么理c语言解递归算法
    这篇文章主要讲解了“怎么理c语言解递归算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理c语言解递归算法”吧!算法思路大家都知道,一个方法自己调用自己...
    99+
    2024-04-02
  • JavaScript中递归函数解“汉诺塔”算法的示例分析
    小编给大家分享一下JavaScript中递归函数解“汉诺塔”算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!“汉诺塔...
    99+
    2024-04-02
  • Javascript迭代、递推、穷举、递归常用算法的示例分析
    小编给大家分享一下Javascript迭代、递推、穷举、递归常用算法的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!累加和累积累加:将一系列的数据加到一个变量里面。最后的得到累加的...
    99+
    2024-04-02
  • 详解Python中递归函数的原理与使用
    目录什么是递归函数递归函数的条件定义一个简单的递归函数代码解析内存栈区堆区死递归尾递归实例什么是递归函数 如果一个函数,可以自己调用自己,那么这个函数就是一个递归函数。 递归,递就是...
    99+
    2024-04-02
  • Java递归算法详解(动力节点整理)
    递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁...
    99+
    2023-05-31
    java 递归 ava
  • Java详细讲解分治算法如何实现归并排序
    目录1.什么是分治算法分治法基本思想2.分治算法的体现——归并排序归并排序基本思想3.代码实现1.什么是分治算法 分治法 分治法,字面意思是“分而治之”,就是把一个复杂的1问题分成两...
    99+
    2024-04-02
  • java迷宫算法的理解(递归分割,递归回溯,深搜,广搜)
    目录递归分割法:递归回溯法:广度优先深度优先:下面是递归分割法、递归回溯法以及文件加载地图实现的类map最近这学期做了一个java迷宫的课程设计,这里代码及其算法逻辑就分享出来。 首...
    99+
    2024-04-02
  • C++实现二叉树非递归遍历算法详解
    目录一、二叉树的前序遍历二、二叉树的中序遍历三、二叉树的后序遍历3.1 方法一3.2 方法二一、二叉树的前序遍历 题目链接 我们可以把任何一棵树看成左路节点,左路节点和右子树。先访问...
    99+
    2023-05-17
    C++二叉树非递归遍历 C++非递归遍历 C++二叉树遍历
  • Java与C++分别用递归实现汉诺塔详解
    目录1.汉诺塔介绍2.解塔步骤3.C++实现(递归结果及显示步骤)(1)递归结果(2)显示步骤4.Java实现(递归结果及显示步骤)(1)递归结果(2)显示步骤1.汉诺塔介绍 汉诺...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作