数据结构:递归(实现n个数的全排列使用C++实现)

数据结构:递归

  • 递归在数据结构中可以用来编制表和树结构的查找和排序算法,在数学领域可以应用于组合数学领域,其处理对象是大量的计数和可能性问题。递归是算法研究、运算研究模型、博弈论和图论的重要课题。

  • 如果解决问题的方法是把一个问题分解成小的子问题,并且这些小的子问题可以用同样的算法解决,那么就可以用递归。当分解到可以解决的比较简单的子问题是分解过程即终止。将这些子问题称为终止条件。

  • 递归运用的是“分而治之”的策略。

如果一种算法的定义组成如下,则它就是递归的。
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;
}

猜你喜欢

转载自blog.csdn.net/jlm7689235/article/details/109279317