数据结构:递归
-
递归在数据结构中可以用来编制表和树结构的查找和排序算法,在数学领域可以应用于组合数学领域,其处理对象是大量的计数和可能性问题。递归是算法研究、运算研究模型、博弈论和图论的重要课题。
-
如果解决问题的方法是把一个问题分解成小的子问题,并且这些小的子问题可以用同样的算法解决,那么就可以用递归。当分解到可以解决的比较简单的子问题是分解过程即终止。将这些子问题称为终止条件。
-
递归运用的是“分而治之”的策略。
如果一种算法的定义组成如下,则它就是递归的。
1、对应于某些参数可以求值的一个或多个终止条件。
2、 一个递归步骤,它根据先前某次值得求当前值。递归步骤最终必须导致终止条件。
递归细节部分
- if(语句)块处理终止条件,else(语句)块处理递归步骤。
- 函数在递归调用过程中,一旦满足终止条件,函数调用的递归链就被打断,从而发生一系列计算,最后返回结果给调用程序。
用递归进行问题求解
折半查找
折半查找以指定的键值为参数扫描含N个元素的有序数组以查找于键值匹配的值。函数返回匹配值得下标,如果没有匹配值则返回-1.折半查找算法可以用递归发描述。
#include <iostream>
#include <vector>
using namespace std;
// 对数组
template <typename T>
int BinSearch(T A[], int low, int high, T key)
{
int mid;
T midvalue;
// 终止条件:key未找到
if (low > high)
{
return -1;
} // 与表的中点值进行比较,若与key不等,则将表分为两半,并对相应子表进行折半查找
else
{
mid = (low + high)/2;
midvalue = A[mid];
// 终止条件
if (key == midvalue)
{
return mid; // key的下标
}
else if (key < midvalue)
{
// 递归
return BinSearch(A, low, mid - 1, key);
}
else
{
// 递归
return BinSearch(A, mid + 1, high, key);
}
}
}
// 对容器
template <typename T, typename TT>
int BinSearch(T A, int low, int high, TT key)
{
int mid;
TT midvalue;
// 终止条件:key未找到
if (low > high)
{
return -1;
} // 与表的中点值进行比较,若与key不等,则将表分为两半,并对相应子表进行折半查找
else
{
mid = (low + high)/2;
midvalue = A[mid];
// 终止条件
if (key == midvalue)
{
return mid; // key的下标
}
else if (key < midvalue)
{
// 递归
return BinSearch(A, low, mid - 1, key);
}
else
{
// 递归
return BinSearch(A, mid + 1, high, key);
}
}
}
int main()
{
vector<double> vi;
for (int i = 0; i != 10; i++)
{
vi.push_back(i);
}
cout << "result = " << BinSearch<vector<double>, double>(vi, 0, vi.size() - 1, 5.0) << endl;
return 0;
}
经过苦思冥想终于在一天的时间内搞了出来,由于没有学习过算法,使得苦逼的自己经历了一番磨难。
实际上主要原因是对递归没有深入了解,现在把程序粘贴在这里,方便自己随时查看,也希望能够帮助其他人。
#include <iostream>
#include <vector>
using namespace std;
void perm(vector<int> &vi, vector<int>::iterator begin,
vector<int>::iterator end, vector<vector<int> > &vvi)
{
if (begin == end)//递归的基础部分
{
vector<int> temp;
for (vector<int>::iterator it = vi.begin(); it != end; it++)
{
temp.push_back(*it);
}
vvi.push_back(temp);
}
else
{
for (auto it = begin; it != end; it++)
{
swap(*begin, *it);
perm(vi, begin+1, end, vvi);
swap(*begin, *it);
}
}
}
int main()
{
vector<int> vi = {1, 2, 3, 4, 5};
vector<vector<int> > vvi;
perm(vi, vi.begin(), vi.end(), vvi);
for (auto a:vvi)
{
for (auto b:a)
cout << b << "";
cout << endl;
}
return 0;
}