我使用递归函数从基于给定和的字符数组中查找子集:
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 !
}
谨致问候。