C 递归算法
给我三个整数运算: A-在数字上加3 B-使数字加倍 C-交换数字的最后两位数字 我应该写一个算法,检查我是否可以用运算A,B,C,分n步生成k个素数。最后,我必须打印我用来生成k素数的操作序列。 假设我们有一个函数:C 递归算法,c,algorithm,recursion,C,Algorithm,Recursion,给我三个整数运算: A-在数字上加3 B-使数字加倍 C-交换数字的最后两位数字 我应该写一个算法,检查我是否可以用运算A,B,C,分n步生成k个素数。最后,我必须打印我用来生成k素数的操作序列。 假设我们有一个函数: bool ifprime(int n); 当数字为素数时,函数ifprime返回true,否则返回false 守则: bool is_possible(int k, int n, int a) { if(ifprime(k)) { return
bool ifprime(int n);
当数字为素数时,函数ifprime返回true,否则返回false
守则:
bool is_possible(int k, int n, int a)
{
if(ifprime(k))
{
return true;
}
if(n==0)
{
return false;
}
switch(a)
{
case 1:
k = A(k); // perform operation A
break;
case 2:
k=B(k); //perform operation B
break;
case 3:
k=C(k); //perform operation C
break;
}
return is_possible(k,n-1,1)||is_possible(k,n-1,2)||is_possible(k,n-1,3);
}
我的问题是,我不知道如何记住正确的路径,然后打印它。将大小为n的数组步长作为第四个参数传递给函数。传递N,数组的总大小,作为第五个参数。输入函数后,将a的值放入步骤[N-N]。与其返回bool,不如返回一个int,该int表示找到素数需要多少步。如果没有找到素数,则返回-1
您需要返回一个int,以了解在不到n步就达到一个质数的情况下,需要多少步才能得出一个答案
int is_possible(int k, int n, int a, int[] steps, int N) {
if(ifprime(k))
{
return N-n;
}
if (!n)
{
return -1;
}
steps[N-n] = a;
...
for (int i = 1 ; i <= 3 ; i++) {
int res = is_possible(k, n-1, i, steps, N);
if (res != -1) return res;
}
return -1;
}
请注意,这种方法可能不够快。您可能需要修改您的递归 将大小为n的数组步长作为第四个参数传递给函数。传递N,数组的总大小,作为第五个参数。输入函数后,将a的值放入步骤[N-N]。与其返回bool,不如返回一个int,该int表示找到素数需要多少步。如果没有找到素数,则返回-1
您需要返回一个int,以了解在不到n步就达到一个质数的情况下,需要多少步才能得出一个答案
int is_possible(int k, int n, int a, int[] steps, int N) {
if(ifprime(k))
{
return N-n;
}
if (!n)
{
return -1;
}
steps[N-n] = a;
...
for (int i = 1 ; i <= 3 ; i++) {
int res = is_possible(k, n-1, i, steps, N);
if (res != -1) return res;
}
return -1;
}
请注意,这种方法可能不够快。您可能需要修改您的递归 如果你想评估所有可能性,我认为你不应该使用开关盒。以下是一种实现您预期目标的方法:-
bool is_possible(int k,int n,int i,char* ch) {
if(ifprime(k)) {
ch[i] = '\0';
return true;
}
if(n==0)
return false;
if(is_possible(A(k),n-1,i+1,ch)) {
ch[i] = 'A';
return true;
}
if(is_possible(B(k),n-1,i+1,ch)) {
ch[i] = 'B';
return true;
}
if(is_possible(C(k),n-1,i+1,ch)) {
ch[i] = 'C';
return true;
}
return false;
}
if(is_possible(3,5,0,ch))
print(ch);
如果你想评估所有的可能性,我认为你不应该使用开关盒。以下是一种实现您预期目标的方法:-
bool is_possible(int k,int n,int i,char* ch) {
if(ifprime(k)) {
ch[i] = '\0';
return true;
}
if(n==0)
return false;
if(is_possible(A(k),n-1,i+1,ch)) {
ch[i] = 'A';
return true;
}
if(is_possible(B(k),n-1,i+1,ch)) {
ch[i] = 'B';
return true;
}
if(is_possible(C(k),n-1,i+1,ch)) {
ch[i] = 'C';
return true;
}
return false;
}
if(is_possible(3,5,0,ch))
print(ch);
或者只需边走边打印,这可能是最简单的方法:
bool is_possible(int k, int n, int a)
{
if(ifprime(k))
{
return true;
}
if(n==0)
{
return false;
}
std::cout << "n=" << n << " a = " << a << std::endl;
switch(a)
{
case 1:
k = A(k); // perform operation A
break;
case 2:
k=B(k); //perform operation B
break;
case 3:
k=C(k); //perform operation C
break;
}
return is_possible(k,n-1,1)||is_possible(k,n-1,2)||is_possible(k,n-1,3);
}
或者只需边走边打印,这可能是最简单的方法:
bool is_possible(int k, int n, int a)
{
if(ifprime(k))
{
return true;
}
if(n==0)
{
return false;
}
std::cout << "n=" << n << " a = " << a << std::endl;
switch(a)
{
case 1:
k = A(k); // perform operation A
break;
case 2:
k=B(k); //perform operation B
break;
case 3:
k=C(k); //perform operation C
break;
}
return is_possible(k,n-1,1)||is_possible(k,n-1,2)||is_possible(k,n-1,3);
}
在检测到肯定结果时打印消息,在每次递归调用后,如果返回值为true,则打印消息。调试完成后,用适当的输出步骤替换打印消息您的意思是输入打印消息“ififprimek”吗{cout每次您的is_可能将返回true时,包括当它从递归调用返回值到自身时,记录消息。在检测到肯定结果时打印消息,在每次递归调用后,如果返回值为true,则打印消息。调试后,用适当的ou替换打印消息tput step你的意思是输入打印消息“ififprimek{cout每当你的“可能”即将返回true时,包括当它从递归调用返回一个值时,记录消息。我想我理解了它,但我有个问题……这三个点意味着代码切换{案例1:k=Ak;//执行操作A中断;案例2:k=Bk;//执行操作B中断;案例3:k=Ck;//执行操作C中断;}?@MarcinMajewski是的-我不想复制你的代码中没有更改的部分。你检查了回忆录上的链接吗?我检查了,这对理解记忆的概念非常有用。我会尝试在代码中使用它。谢谢你,我想我理解了,但我有个问题……这三个点意味着代码转换A{案例1:k=Ak;//执行操作A中断;案例2:k=Bk;//执行操作B中断;案例3:k=Ck;//执行操作C中断;}?@MarcinMajewski是的-我不想复制你代码中没有更改的部分。你检查了备忘录的链接吗?我检查了,这对理解记忆的概念非常有用。我会尝试在代码中使用它。谢谢