要期末了,做点笔记吧QwQ
1、递归算法
递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归过程一般通过函数或子过程来实现。
递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。
递归算法解决问题的特点:
递归就是在过程或函数里调用自身。
在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。(这一段是copy的)
至于工作原理要涉及堆和栈,太抽象了会不了一点,直接跳过
例题:
已知C(m,n)表示从m个元素中取n个的组合数,又知C(m,n)=C(m-1,n)+C(m-1,n-1);C(m,m)=1;C(m,1)=m;
请递归求出组合问题的解
下面是程序
#include <iostream>
// 函数原型声明
long long combination(int m, int n);
int main() {
int m, n;
std::cin >> m >> n; // 输入m和n
std::cout << combination(m, n) << std::endl; // 输出组合数C(m, n)
return 0;
}
// 组合数函数实现
long long combination(int m, int n) {
if (m == n) return 1; // C(m, m) = 1
if (m == 1) return n; // C(1, n) = n
if (n == 0) return 1; // C(m, 0) = 1
if (n == 1) return m; // C(m, 1) = m
// 递归计算
return combination(m - 1, n) + combination(m - 1, n - 1);
}
2、排序算法
最典的冒泡排序
#include<iostream>
using namespace std;
int main()
{
int arr[9] = { 4,2,8,0,5,7,1,3,9 };
cout << "排序前" << endl;
for (int i = 0; i < 9; i++)
{
cout << arr[i] << " ";
}
cout << endl;
for (int i = 0; i < 9 - 1; i++)
{
for (int j = 0; j < 9 - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < 9; i++)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
我的评价是味大,无需多盐
选择排序法
例:用选择排序法对十个数排序(从小到大)
算法:首先在未排序序列中找到最小元素,存放在排序序列的起始位置。 再从剩余未排序元素中寻找最小元素,然后存放在已排列序列的末尾
#include<iostream>
using namespace std;
void selection_sort(int* arr, int len)
{
int min;//存放最小值的下标
for (int i = 0; i <= len; i++)
{
min = i;//初始化选取假设的最小值,选取的是未排序序列的第一个数
for (int j = i; j <= len; j++)
{
if (arr[j] < arr[min])//如果遇见更小值,则记录最小值下标
{
min = j;
}
}
//内循环退出,确定了最小值
//将最小值移动到已排列序列的末尾
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
int main()
{
int arr[] = { 5,0,1,8,6,2,3,4,9,7 };
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i <= len - 1; i++)
{
cout << arr[i] << endl;
}
cout << endl;
cout << "排序后的数值:";
selection_sort(arr, len - 1);
for (int i = 0; i <= len - 1; i++)
{
cout << arr[i] << " ";
}
}
剩下的学了再补喵