c-我不能在给定求和的基础上生成数组的子集



我使用递归函数从基于给定和的字符数组中查找子集:

str="1234567890"

n=2(子集的大小(、m=9(给定的和(。解决方案:{9,0},{0,9},{8,1},{1,8},{7,2},{2,7},,,,,{5,4},{4,5}。我的代码如下。

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
void genrate(char*,int,int,int);
int main(){
char str[20]="1234567890";
genrate(str,2,9,10);
}
void genrate(char *str,int n,int m,int k){
int i,j,sum;
sum=0;
if(sum==m){
for(i=0; i<n; i++){
printf("%c ",str[i]);
}
printf("n");
}
sum+=(int)str[k]-48;
genrate(str,n,m,k);
genrate(str,n,m,k-1);
}

这个答案并没有给出解决方案,但我只想指出一些关于递归的错误。

首先,局部变量不是一个好主意,例如,变量sum将在下一次递归调用中被重新定义,因为这个新调用将执行int i,j,sum;初始化,我打印了求和和检查的地址:

Address of SUM : 5f7ac8
Address of SUM : 5f7a98
Address of SUM : 5f7a68
Address of SUM : 5f7a38
Address of SUM : 5f7a08

每次通话时都会发生变化。。。

并且对CCD_ 6的第二次调用将永远不会被调用。。。因为它总是被困在一个无休止的调用循环中(generate((->generate(((->generate((->(。

在递归函数中,您需要定义递归性结束的条件,在您的情况下,没有结束条件。。。

例如factoriel:

long int fact(int n) {
if (n>=1)
return n*fact(n-1);
else
return 1; // Here the end of the recursivity !
}

谨致问候。

最新更新