Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 递归算法_C_Algorithm_Recursion - Fatal编程技术网

C 递归算法

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

给我三个整数运算: 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 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是的-我不想复制你代码中没有更改的部分。你检查了备忘录的链接吗?我检查了,这对理解记忆的概念非常有用。我会尝试在代码中使用它。谢谢