递归C++

news/2024/9/21 12:40:40

文章目录

    • 什么是递归
    • 递归算法特点
    • 主要递归
    • 总结

什么是递归

递归算法是一种直接或者间接调用自身方法的算法。简言之:在定义自身的同时又出现自身的直接或间接调用。

递归算法特点

递归算法解决问题的特点:
1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

主要递归

1:斐波那契数列

f(1)=1;
f(2)=1;
f(n)=f(n-1)+f(n-2);

2:快速排序:

#include<iostream>using namespace std;
const int N = 1e6 + 10;
int q[N];
void quick_sort(int q[], int l, int r) {if (l >= r)return;int x = q[l], i = l - 1, j = r + 1;while(i < j) {do i++; while (q[i] < x);do j--; while (q[j] > x);if (i < j)swap(q[i], q[j]);}quick_sort(q, l, j);quick_sort(q, j + 1, r);}
int main() {int n;cin >> n;for (int i = 0; i < n; i++) cin >> q[i];quick_sort(q, 0, n - 1);for (int i = 0; i < n; i++)cout << q[i];return 0;
}

3:汉诺塔:

#include <stdio.h>
#include <string.h>
void move(char A,int n,char B)//定义一个move函数,来打印往哪挪,谁挪。 
{printf(" %d 从%c挪到%c\n",n,A,B);
}
void Hanoi(int n,char A,char B,char C)//汉诺塔递归 
{if(n==1)//递归终结条件 move(A,1,C);else{Hanoi(n-1,A,C,B);move(A,n,C);Hanoi(n-1,B,A,C);}
}
int main()
{int a;char A = 'A',B = 'B',C = 'C';printf("请输入汉诺塔的层数:");scanf("%d",&a);Hanoi(a,A,B,C);return 0;
}

在这里插入图片描述

在这里插入图片描述
正常许多排序递归的时间复杂度都是在O(nlogn), 递归函数每递归一次都会运行出两个二分递归函数

各时间复杂度如下:
在这里插入图片描述

总结

找重复:
1.找到一种划分的方法
2.找到递推公式或者等价转换 这些都是父问题转化为求解子问题。
找变化的量:变化的通常要作为参数
找出口。

在许多情况下是不会用到递归的,当数据量特别大的时候,许多的递归的中间过程都是不需要的(对结果的产生没有影响),每次递归可能都会有大量重复的时候一般会用预处理出所有数据,避免了大量时间都用来递归重复的中间过程,比如求阶乘、累加、斐波那契······
但比如快速排序每次递归都会对这一段的序列产生影响,所以用递归就非常有效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/17622.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[摘]终于找到一个有助理解left/right/full outer join的例子

近日在学习《Understading DB2》的时候找到了一个例子&#xff0c;对于理解 left/right/full 三种 outer join 的大有裨益。 先看样本数据&#xff0c;来自DB2的示例数据库 sample&#xff1a; db2 > insert into employee values(99999,killkill,N,Huang,null,null,null,no…

pickle.load,pickle.dump构建Coco数据集labels的pickle文件

1. 效果图 write pickle: coco_classes.pickle done loading: coco_classes.pickle [person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, traffic light, fire hydrant, stop sign, parking meter, bench, bird, cat, dog, horse, sheep, cow, elephant, …

数据结构--树和二叉树

文章目录树和二叉树树1.树的定义2.树的逻辑表示3.树的基本术语&#xff1a;4.树的性质5.树的基本运算二叉树二叉树的存储结构二叉树的遍历树和二叉树 树 1.树的定义 2.树的逻辑表示 树形表示法文氏图表示法凹入图表示法括号表示法3.树的基本术语&#xff1a; 1‘结点的度&am…

使用Keras训练Lenet网络来进行手写数字识别

使用Keras训练Lenet网络来进行手写数字识别 这篇博客将介绍如何使用Keras训练Lenet网络来进行手写数字识别。 LeNet架构是深度学习中的一项开创性工作&#xff0c;演示了如何训练神经网络以端到端的方式识别图像中的对象&#xff08;即不必进行特征提取&#xff0c;网络能够从…

关闭Windows 7中的 Program Compatibility Assistant

感觉微软总喜欢把简单问题复杂化。安装几个小软件也老是弹出这样的对话框&#xff1a; 然后点击“What settings are applied?”&#xff0c;看到帮助中一段&#xff1a; 提示我在组策略里能够关闭这个烦人的程序兼容性助手&#xff0c;却没有明说&#xff0c;故意卖关子呢。那…

数据结构--DFS

文章目录排列数字n皇后问题方法一方法二排列数字 给定一个整数 n&#xff0c;将数字 1∼n 排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;按照字典序将所有的排列方法输出。 利用DFS解决全排列问题 dfs 最重要的是搜索顺序。用什么顺序遍历所有方案。 对于全…

使用Python,OpenCV沿着轮廓寻找极值点

使用Python,OpenCV沿着轮廓寻找极值点 这篇博客将介绍如何使用Python,OpenCV沿着轮廓寻找极值点,找到最北、最南、最东和最西(x,y)坐标。虽然这项技能本身并不有用,但它通常被用作更高级计算机视觉应用程序的预处理步骤。这种应用的一个很好的例子是手势识别(hand ges…

图像识别-opencv

文章目录基本处理基本处理 读取图像 存储图像 import cv2 color_imgcv2.imread(test.png) print(color_img.shape)# 读取单通道 gray_imgcv2.imread(test.png,cv2.IMREAD_GRAYSCALE) print(gray_img.shape)#把单通道图像保存后&#xff0c;再读取&#xff0c;仍然是3通道&…