递归的难题

donkey20041121 2007-11-28 05:15:31
这是c程序设计的抽象思维第五章第4题。想半天想不出来。题目如下
有一字符串如AABB里面包含重复的字符。要把它所有的不重复排练打印出来。

AABB
ABAB
ABBA
BAAB
BABA
BBAA
函数原型如下
void ListPermutations( char *s )
请赐教
...全文
180 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mu_yang 2007-12-01
  • 打赏
  • 举报
回复
我也没有更好的方法
思想上和楼主基本一致
至于效率可能更低
和楼主对对答案
AAABBB: 20种排列
AABBCC: 90种排列



#include <stdio.h>

void listperm( char * , char * );
int in ( char , char * , char * );
void swap ( char * , char * );

int main(void)
{
char str[]="AAABBB";
listperm(str,str);
return 0;
}

void listperm( char *firm , char *move )
{
static int len;

if ( *move == '\0' )
{
if ( *firm =='\0')puts( firm - len );
return;
}

if ( !in ( *move , firm , move - 1 ) )
{
swap( firm , move );
len ++;
listperm( firm + 1 , firm + 1 );
len --;
swap( firm , move );
}
listperm( firm , move + 1 );
}

int in( char c , char * front , char * behind )
{
if( front > behind )return 0;
if( c == *behind ) return 1;
return in ( c , front , behind -1 );
}

void swap(char *c1 , char *c2)
{
char temp;
temp = *c1;
*c1 = *c2;
*c2 = temp;
}
donkey20041121 2007-11-30
  • 打赏
  • 举报
回复
yutaooo说的是对的。就是这个意思。IsDup参数的含义就是那个for循环里的k和i
yutaooo 2007-11-29
  • 打赏
  • 举报
回复

就是说有2个A,2个B,要排列出所有不重复的字符串?
donkey20041121 2007-11-29
  • 打赏
  • 举报
回复
不重复的含义是这样的,假如有AABB 。B会和第一个A交换,但是最后一个B也会和A交换。于是造成了重复的排列。我每次要检查前面的字符是否有和当前字符重复的情况
mu_yang 2007-11-29
  • 打赏
  • 举报
回复
既然要求递归
大体也只能这样吧

感觉IsDup稍微罗嗦了一点
有改进的余地
由于没完全看懂那个函数里变量的含义
所以只能说是一种感觉
供参考
yuyanping1982 2007-11-28
  • 打赏
  • 举报
回复
写得挺漂亮的
yutaooo 2007-11-28
  • 打赏
  • 举报
回复

什么叫不重复的?稍微解释一下。没书啊,不知道上下文的。
languagec 2007-11-28
  • 打赏
  • 举报
回复
写得挺漂亮的
donkey20041121 2007-11-28
  • 打赏
  • 举报
回复
想出来了。但是效率不高。有没有更好的方法
#include <stdio.h>
#include <string.h>


void Swap( char *a, char *b )
{
int temp;

temp = *a;
*a = *b;
*b = temp;
}

//IsDup: 之前是否有重复的元素,有的话返回1,没有返回0
//如果i == j返回0
int IsDup( char *s, unsigned int k, unsigned int i )
{
unsigned int j;

if (k == i)
return 0;
else if (s[k] == s[i])
return 1;
else
{
for (j=i-1; j>k; --j)
{
if (s[j] == s[i])
return 1;
}
}
return 0;

}

//RecursivePermute: ListPermute的驱动
//k的含义是固定了的前k个字符
void RecursivePermute( char *s, unsigned int k)
{
unsigned int i;

if (strlen(s) == k)
{
puts( s );
}
else
{
for (i=k; i<strlen(s); ++i)
{
if( !IsDup(s,k,i) )
{
Swap( s+k, s+i);
RecursivePermute( s,k+1 );
Swap( s+k, s+i );

}
else
continue;
}
}
}

//ListPermutation:
void ListPermutation( char *s )
{
RecursivePermute( s, 0 );
}

void main()
{
char s[] = "AABB";

ListPermutation( s );
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧