非常抱歉昨天博主没有及时更新微博。主要原因是昨天晚上下了暴风雪,所以博主急着赶回家睡觉,就没有更新微博。这不是今天趁着开zemi之前及时更新了嘛。首先大家看了看题目就知道全排列了。全排列其实是一个挺恶心的东西。因为这个东西首先大家想到的是迭代了,但是这里的迭代有点蛋疼,因为如果我给你n个字符你就要写n个for循环。所以这里我需要和大家说的是,如果大家以后遇到这种需要写很多迭代的程序,大家一定要考虑递归。因为实际上迭代和递归是没有区别的,但是如果有的选的话大家一定要选择迭代,因为迭代需要的空间和时间花费往往更小。但是像全排列这东西还是挺恶心的,因为你需要根据字符长度选择循环次数,真心是恶心啊。
T temp=*a;
好了,接下来我给大家说一下问题描述了。比如说,这里有一个字符串abcd,大家要把它全排列输出就是:
abcd,abdc,acbd。。。。。总共4*3*2=24个字符。好了,现在上代码:
// blog_full_array.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
using namespace std;
template
void my_swap(T *a, T *b)//这里的swap的方法其实和std::swap是一样的,但是这种方法henlow,如果大家可以的话还是使用boost::swap,它的空间和时间花费更小。
{
*a=*b;
*b=temp;
}
template//这里是真正递归的函数。这里其实和观察者模式很像,其实就是设置额外的参数去观察主要变量的变化,做出一些行动。这里就是如果迭代到最后一个字符就把他打印出来。
void _full_array(T *source, T* head, size_t length)
{
if (length==0)
{
cout<<source<<endl;//打印字符
return;
}
else
{
for(size_t tempi=0;tempi
{
my_swap(head,head+tempi);//这里的三句话其实道理还是很复杂的,我希望不懂得童鞋自己画画示意图,然后大家就会知道为什么这里要调换两次,和中间的那句迭代。
_full_array(source,head+1,length-1);
my_swap(head+tempi,head);
}
}
}
template
void full_array(T* head, size_t length)
{
T *source=head;
_full_array(source,head,length-1);
}
int main()
{
char char_array[5]={'a','b','c','d','\0'};//这里最后一个字符是0,主要就是为了输出的时候找到字符串的结束符。
full_array(char_array,5);
return 0;
}
输出结果: