递归全排列 c语言 看不懂

2024-05-05 02:15

1. 递归全排列 c语言 看不懂

perm(list,i,j)是一个全排列函数,拿你上面的列子来说:
perm(list,0,5)意思是数组list的前6个数(第0个数到第5个数)的所有排列,它细分的话就等于:第0个数和第1个数互换以后的perm(list,1,5) 第0数和第2数互换perm(list,1,5) ....第0数和第5数互换的perm(list,1,5)  和它本身的所在0位置的perm(list, 1, 5)
如假如6个数是1 2 3 4 5 6
他们的排列就 * * * * * * perm(list,0,5)
1 * * * * * perm(list,1,5)  
2 * * * * * perm(list,1,5)
3 * * * * * perm(list,1,5)
4 * * * * * perm(list,1,5)
5 * * * * * perm(list,1,5)
6 * * * * * perm(list,1,5)  就是每一个数都在第0个位置上面都出现一次以后的排列总和。 也就是它的for循环的意思
这只是形象的比喻一下

递归全排列 c语言 看不懂

2. 不懂递归全排列

看递归程序,先要了解算法中的递归性,即反复调用自已。还要不再递归的情况。
递归算法描述简单,但算法不一定好,这个全排列要大量占用栈,完全可以不用递
归。当然这是练习,练练递归。 
百度上搜一下,许多博客上有。 给出一个递归算法;
1、将一个n维数组初始化,第0位填1,第1位填2.。。。。。 第n-1位填n;
2、将数组看为两部分,一个是已排好的,剩下是待排的,分别用两个指针指向;
3、将第一个字符,依次与后n-1个字符交换值,每次交换得到一个新的首数字;
4、剩下的n-1个数字按2、3步骤重复直至所有数组完成排列; 
//--------------------------------------------- 
int d[100];                       // 全排列
int dn;                             // 全排列的个 数
void  init(int d[],int n)         // 初始填入数据
{
      dn=n;
      for (int i=0;i<n;i++)
          d[i]=i+1;
}
void  output(int d[],int n)       // 输出
{
      String s="";
      for (int i=0;i<n;i++)
         s=s+String(d[i])+" ";
      Form1->Memo1->Lines->Add(s);     // 显示到文本框
}
//-----------------------------------
void  swap(int &x,int &y)       // 交换
{
      int t=x;   x=y;   y=t;
}
void perm(int d[],int n,int j)  //  j起始下标
{
     if (j==n)
           output(d,n);                  // 输出
   else
         for (int i=j;i<n;i++)
            {
               if (i!=j)
                  swap(d[j],d[i]);     // 交换
               perm(d,n,j+1);
               if (i!=j)
                  swap(d[j],d[i]);    //  恢复
     }
}
//-----------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
      init(d,4);
      perm(d,dn,0);
}
//------------------------------------------
//   这是C++BULDER,稍改一点点就适合你的C++

3. c++quicksort递归排序看不懂

1.最简单情况 start>=end ,表示pstr中没有字符(>)或有一个字符(=)pstr已经有序。结束!
2.用第一个字符将 pstr 分为俩部分pstr[0-(current-1)](=第一个字符)。再用sort(pstr,start,current-1);sort(pstr,current+1,end);
if(!(start<end))
  return;
swap(pstr,start,(start+end)/2);//假如pstr完全无序,这一步则没有必要;但pstr已经有序,这一步则可以减小Swap。
int current=start;
for(int i=start+1;i<=end;i++){
  if(*(pstr[i])<*(pstr[start]))//是否小于第一个字符。
     swap(pstr,++current,i); //保证了[start+11-current]的字符都小于第一个字符。
}保证了ptr中小于第一个字符的,都已经在[start+1-current]中。
swap(pstr,start,current);//保证了ptr中小于第一个字符的,都已经在[start-current-1]中。
sort(pstr,start,current-1);
sort(pstr,current+1,end);
、、、、、、、、
void swap(string* pstr[],int first ,int second){
//应该测试first == second;
if(first==second) return;
string* temp=pstr[first];
pstr[first]=pstr[second];
pstr[second]=temp;
}

不说了!!!自己学吧。

c++quicksort递归排序看不懂

4. 这是一个背包问题的递归算法 可是我看不懂

*

输入:
s 背包的体积
n 物品的数量
w[] 每件物品的体积
输出:
若存在至少一种刚好装满背包的方式,则输出这种方式;
若不存在,则输出no solution

该算法使用递归函数knap。
该函数首先尝试将最后一件物品放入背包,则物品减少一件,背包可用体积相应减少,然后对当前状态进行递归……
若有解则递归结束;若无解则抛弃最后一件物品,然后对当前状态进行递归……

5. 如何给mp3里面得歌排序(不考虑下软件)(不懂装懂的,只想赚两分的贱人别进来)

你新建一个文件夹,按你的顺序把歌拉进那个文件夹就OK了。
有效。

如何给mp3里面得歌排序(不考虑下软件)(不懂装懂的,只想赚两分的贱人别进来)

6. 逆序输出你输入的数的C程序中的递归,有一点地方不懂,请高手进:

没有错,我运行了一下很正确!

7. 求一个韩国女组合,记的她们的一首歌好像有句hey Mr.的歌词,其它是韩文看不懂

是kara 的MR.吧

组合名称:Kara
  Kamilia应援气球韩文写法:카라
  所属公司:DSP Entertainment
  出道日:2007年03月29日
  组合成员:朴奎利,韩胜妍,具荷拉,郑妮可,姜智英,金成熙(已退出)
  官方歌迷名称为:Kamilia(这个名字是当初官方歌迷会经过投票选出.)
  Kamilia的意思是:Kara + Familia。其中Familia是和Kara同为希腊语,Familia的意思是Family(家庭)这样组合起来就是Kara和Kara的familiy,意思即代表Kara和Fans是一体的意思
  应援物:肉芋色气球

http://baike.baidu.com/view/1166366.html?wtp=tt

亲可以看这里

求一个韩国女组合,记的她们的一首歌好像有句hey Mr.的歌词,其它是韩文看不懂

8. 请高手看一下这个最简单的递归代码,实在不懂

楼上没学过C吧?
递归函数嘛,
这个很简单也很正常.
n=10开始,然后执行
cin>>c; 
iochar(n-1); 
递归嘛,一直到n=1 
执行.cin>>c; 
cout<<c; 
最后执行
cout<<c; 
但是很调用一次函数都有一句
cout<<c;
在输入完十个数之前不会输出,因为每次调用函数都会要求一个输入值.
所以必须当你全部输入完程序才能正常运行.
为什么会倒着输出呢,
显然最后运行时是从最内圈才始的,cout<<c;
这个c在最内圈的函数里,最后一个输入的,最先输出.