我正在使用一个递归函数来根据给定的和从字符数组中查找子集:
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);
}发布于 2020-02-25 09:22:22
这个答案并没有给出解决方案,但我只是想指出一些关于递归的错误。
首先,局部变量不是一个好主意,例如,变量sum将在下一个递归调用中重新定义,因为这个新调用将执行int i,j,sum;初始化,我打印了sum和check的地址:
Address of SUM : 5f7ac8
Address of SUM : 5f7a98
Address of SUM : 5f7a68
Address of SUM : 5f7a38
Address of SUM : 5f7a08每次调用时都会发生变化。
对genrate(str, n, m, k - 1)的第二个调用将永远不会被调用...因为它总是陷入无休止的调用循环{generate() ->)。
在递归函数中,你需要定义一个递归结束的条件,在你的例子中没有结束条件...
例如factoriel:
long int fact(int n) {
if (n>=1)
return n*fact(n-1);
else
return 1; // Here the end of the recursivity !
}致以问候。
https://stackoverflow.com/questions/60385807
复制相似问题