一个递归程序的复原问题,有人有耐心帮我找吗?
c++吧
全部回复
仅看楼主
level 10
#include <iostream>
using namespace std;
int main()
{
void subclass(char *a,const int n);
char a[4]={'a','b','c','d'};
subclass(a,4);
for(int i=0;i<4;i++) //输出调用函数后的a[4],检查函数复原的正确性
cout<<a[i];
cout<<endl;
return 0;
}
void subclass(char *a,const int n)
{
if(n==2) //n=2时终止递归
{cout<<a[0]<<endl;
cout<<a[1]<<endl;
} else
for(int i=0;i<n;i++) //剔除掉第i个元素,先输出,再往下递归
{for(int j=0;j<n;j++)
if(j!=i) cout<<a[j];
cout<<endl;
char temp=a[i]; //将a[i]挖掉,后面的前移一位
for(j=i;j<n-1;j++)
a[j]=a[j+1];
subclass(a,n-1);
for(j=i+1;j<n;j++) //从a[i]开始后移一位,复原a[i]
a[j]=a[j-1];
a[i]=temp;
}
}
2011年09月14日 03点09分 1
level 10
我是在写一个输出字符数组自己的递归函数
现在已经查出来了N个错误:
1、用递归函数输出子集会带来重复问题
2、我在每一层递归都设置了字符数组还原功能,就是先剔除掉a[i],a[i]后面的都前移一位,调用下一级递归,然后从a[i]开始后移一位,再讲a[i]还原。
我在主函数调用这个递归函数后,,输出了下a[4]测试这个还原功能是否正常,结果输出是abbb,现在我主要在想这个错误,想了半个小时了还没出来,所以来伸手...
好吧我知道这个有点过分,如果大家忙的话不用搭理我,我清醒下下午接着想
2011年09月14日 03点09分 2
level 11
设断点Debug
2011年09月14日 06点09分 3
level 1
for(j=i+1;j<n;j++) //从a[i]开始后移一位,复原a[i]
a[j]=a[j-1];
a[i]=temp;
从 subclass函数的第一个for循环起:
i=0时,
第二次递归结束时,a为cddd
然后执行上面一段程序,a为bccc
接着回到第一次递归,接着执行上面的程序,a为abbb
i=1时,
第二次递归结束时,a为bbbb
执行上面程序,a为bbbb
回到第一次递归,执行上面程序,a为abbb
i=2,i=3时的情况与的、i=1的情况一样。
for循环在这不起作用。
如果你仅仅想实现递归恢复数组a,我觉得可以不用第一个for循环,从上面一段的程序的n值下手就可以完成。

2011年09月14日 07点09分 4
1