下面这个C语言如何从递归入手啊?
本题要求实现一个递归函数,生成给定字符集合内所有的n位密码,要求密码的相邻字符不同。
函数接口定义:void generatePasswords(char *characters, int n);
其中,characters是用户输入的字符集合,n是密码长度(n>1),可增加递归函数实现上述功能。
#include
void generatePasswords(char *characters, int n);
int main()
{
int n;
char characters[256];
scanf("%s %d", characters, &n);
generatePasswords(characters, n);
return 0;
}
/* 请在这里填写答案 */
作者可以尝试一下下述代码,我测试了几个示例是没有问题的
// 递归函数,辅助生成密码
void generatePasswordsHelper(char *characters, int n, char *password, int index);
// 生成密码的递归函数
void generatePasswords(char *characters, int n) {
// 初始化一个长度为n+1的字符数组,用于存储当前生成的密码
char password[n+1];
memset(password, 0, sizeof(password)); // 将数组清零,避免出现随机值
generatePasswordsHelper(characters, n, password, 0); // 调用辅助函数,从第0个位置开始生成密码
}
// 辅助函数,用于生成密码
void generatePasswordsHelper(char *characters, int n, char *password, int index) {
// 如果已经生成了n个字符,输出当前密码并返回
if (index == n) {
printf("%s\n", password);
return;
}
// 枚举字符集合中的每个字符
for (int i = 0; characters[i] != '\0'; i++) {
// 如果当前位置是第一个字符,或者当前字符与前一个字符不同,则可以将当前字符放在当前位置上
if (index == 0 || characters[i] != password[index-1]) {
password[index] = characters[i]; // 将当前字符放在当前位置上
generatePasswordsHelper(characters, n, password, index+1); // 递归生成下一个位置的字符
password[index] = '\0'; // 回溯到上一个状态,将当前位置上的字符清空
}
}
}
例如,给定字符集合为1A2B,所有符合要求的2位密码为1A 12 1B A1 A2 AB 21 2A 2B B1 BA B2。