字符串的所有子串的各种组合的递归算法的代码看不大懂啊,高人来解释一下啊,谢谢

shu_yoyo 2007-07-01 04:26:06
#include <stdio.h>
#include <string.h>
#include <alloc.h>

char str[ ] = "abcd";
char *out;
int length;
void decombine(char in[],char out[],int length,int rec,int start)
{
int i;
for(i=start;i<length;i++)
{
out[rec] = in[i];
out[rec+1] = '\0';
printf("%s%d\n",out,i);
if(i<length-1)
decombine(in,out,length,rec+1,i+1);
}
}
int main( )
{
length = strlen(str);
out = (char *)malloc(length+1);
decombine(str,out,length,0,0);
return 0;
}
看了很久了,还是不大懂啊,,,5555555,高人来解释一下哈
...全文
581 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
0黄瓜0 2007-07-02
  • 打赏
  • 举报
回复
理解递归先要理解函数的调用.学过一点汇编程序设计就更好了.先从简单的如用递归求阶乘,或用递归反序输出字串等简单递归开始理解.
titanaly 2007-07-01
  • 打赏
  • 举报
回复
还不会跟踪呢.......
jixingzhong 2007-07-01
  • 打赏
  • 举报
回复
对于递归,
如果难以理解,
比较合适的办法就是单步查看执行结果并予以分析 。。。

分析多了就对递归熟悉了 。。。
jixingzhong 2007-07-01
  • 打赏
  • 举报
回复
这个递归太恐怖了 。。。

递归次数按照几何级数上升....
uwinb 2007-07-01
  • 打赏
  • 举报
回复
char str[] = "abc";
char *out;
int len;

void decombine(int end,int start)
{
int i;
for (i=start; i<len; ++i)
{
out[end] = str[i];
out[end+1] = '\0';
printf("%s\n",out,i);
if (i<len-1) decombine(end+1,i+1);
}
}

main( )
{
len = strlen(str);
out = (char*)malloc(len+1);
decombine(0,0);
return 0;
}
uwinb 2007-07-01
  • 打赏
  • 举报
回复
对于函数decombine(char in[],char out[],int length,int rec,int start);
前两三参数(in,out,length)既然已经定义成全局变量,可以在函数参数列表中删除它们,
先不考虑递归,该函数体中有一个循环,它输出(length-start)个长度为(rec+1)的子串。
递归调用时参数(rec+1,i+1),也就是说子串长度在增加,候选字符的范围在缩小。
uwinb 2007-07-01
  • 打赏
  • 举报
回复
如果不是编程,要求你手工写出所有子串,你会怎么考虑?
第一个子串肯定是空串 "" ,空集是所有集合的子集;
然后开始枚举所有单字符的子串 "a" "b" "c" "d"$
接着考虑长些的子串"ab" "ac" "ad"$ "bc" "bd"$ "cd"$
还有更长的子串 "abc" "abd"$ "acd"$ "bcd"$
最长的子串 "abcd"$
可以发现所有子串序列都终结于'd'(见所有带'$'后缀的子串)。
上面的子串呈现树状分布,程序输出所有子串的序列,是对该树的前序遍历,
即先访问树的根结点,再按从左到右有顺序访问它的所有子树。
shu_yoyo 2007-07-01
  • 打赏
  • 举报
回复
高手说一下哈,分不够的话我重新开帖加~
bargio_susie 2007-07-01
  • 打赏
  • 举报
回复
单步跟踪,慢慢体会.

69,371

社区成员

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

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