回 帖 发 新 帖 刷新版面

主题:[讨论]关于递归的问题,有些看不懂,请高手指点一下!

题目是这样的:编写一个函数来显示字符串s的所有的组合


如:输入  ABC
   输出  ABC ACB BAC BCA CBA CAB (输出顺序当然可以不一样)
递归的思想是这样的:
  将ABC 看成是 字母 'A' + 字符串 "BC"
               字母 'B' + 字符串 "AC"
               字母 'C' + 字符串 "AB"
用这种思想来处理算法是这样给出的,但是我看不懂,请高手指点指点

static void Exchange(string str , int p1 ,int p2)
{
 char tmp ;
 
 tmp = str[p1];

 str[p1] = str[p2] ;

 str[p2] = tmp ;

}

static  void Recrusive (string str , int k)
{
 int i ;

 if ( k == stringlength(str))
  {
   printf("%s\n" , str) ;
   }
  else {
   for( i = k ; i < stringlength(str) ;i++)
   {
     Exchange(str , k ,i);
    
     Recrusive(str ,k + 1 );
 
     Exchange(str , k ,i);

   }
       }
}

回复列表 (共3个回复)

沙发

题目是这样的:编写一个函数来显示字符串s的所有的组合


如:输入  ABC
   输出  ABC ACB BAC BCA CBA CAB (输出顺序当然可以不一样)
递归的思想是这样的:
  将ABC 看成是 字母 'A' + 字符串 "BC"
               字母 'B' + 字符串 "AC"
               字母 'C' + 字符串 "AB"
用这种思想来处理算法是这样给出的,但是我看不懂,请高手指点指点

static void Exchange(string str , int p1 ,int p2)
{
 char tmp ;
 
 tmp = str[p1];

 str[p1] = str[p2] ;

 str[p2] = tmp ;

}

static  void Recrusive (string str , int k)
{
 int i ;

 if ( k == stringlength(str))
  {
   printf("%s\n" , str) ;
   }
  else {
   for( i = k ; i < stringlength(str) ;i++)
   {
     Exchange(str , k ,i);
    
     Recrusive(str ,k + 1 );
 
     Exchange(str , k ,i);

   }
   }
}
1:i=k不交换Recrusive(str ,k + 1 );
2:i=k不交换Recrusive(str ,k + 1 );
3:k=len(str)打印ABC;
返回k=2;
执行Exchange(str , k ,i);不交换

返回k=1;
i++;
ABC中的BC交换
打印ACB
返回k=0;
ABC中的AB交换打印BAC
继续深层次递归:
BAC中的AC交换打印BCA
......
在纸上用笔一步一步的算吧



板凳

还想请问一下返回的K 的值为何是递减的

3 楼

k有被返回吗?
程序应该是从k=0开始,直到k == stringlength(str)结束递归.
算法是先确定左边的字母,把其作为标准字母,依次让标准字母和右边的每个字母互换,输出不同的组合.每调用递归函数一次,标准字母向左移动一个位置.
以字母A,B,C为例
1 第一层递归:以A为标准字母,即此时k=0,当i=k时,执行Exchange(str , k ,i);交换A和A(实际上相当于不变);执行Recrusive(str ,k + 1 );进入第二层递归
  第二层递归:以B为标准字母,即此时k=1,当i=k时,执行Exchange(str , k ,i);交换B和B(实际上相当于不变);执行Recrusive(str ,k + 1 );进入第三层递归
  第三层递归:此时k=2,满足 ( k == stringlength(str)),输出组合ABC,然后回到第二层递归,
2 第二层递归:执行Exchange(str , k ,i);把B和B换回来;
执行i++, 此时k=1, i=2;执行Exchange(str , k ,i);交换B和C
执行Recrusive(str ,k + 1 );进入第三层递归
  第三层递归:此时k=2,输出组合ACB,然后回到第二层递归,
3 第二层递归:执行Exchange(str , k ,i);把B和C换回来;
执行i++, 此时k=1, i=3;不满足i < stringlength(str),退出循环,回到第一层递归.
4 第一层递归: 执行Exchange(str , k ,i);把A和A换回来;
执行i++, 此时k=0, i=1;执行Exchange(str , k ,i);交换A和B
执行Recrusive(str ,k + 1 );进入第二层递归
5 第二层递归:以A(此时处在第二的位置)为标准字母,即此时k=1,当i=k时,执行Exchange(str , k ,i);交换A和A(实际上相当于不变);执行Recrusive(str ,k + 1 );进入第三层递归
  第三层递归:此时k=2,满足 ( k == stringlength(str)),输出组合BAC,然后回到第二层递归,

此后的情形与上述过程类似!



我来回复

您尚未登录,请登录后再回复。点此登录或注册