当前位置: 首页 > 知识库问答 >
问题:

使用递归的算法

夏朝
2023-03-14

我得到了三个整数操作:
A-将3添加到number
B-将数字
C加倍-交换number
的最后两位数字我应该编写算法来检查我是否可以在n步中使用操作A、B、C制作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);
}

我的问题是,我不知道如何记住正确的路径,然后打印出来。

共有3个答案

杜禄
2023-03-14

如果你想评估所有的可能性,我认为你不应该使用开关盒。这里有一个方法可以做到你想要的:-

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);
后焕
2023-03-14

或者只需边走边打印(这可能是最简单的方法):

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);
}
岳毅
2023-03-14

将大小为n的数组步骤作为第四个参数传递给您的函数。传递N,数组的总大小,作为第五个参数。输入函数时将a的值放入步骤[N-n]中。不是返回bool,而是返回一个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;
}

请注意,这种方法可能不够快。您可能需要记住您的递归。

 类似资料:
  • 主要内容:递归的底层实现机制编程语言中,我们习惯将函数(方法)调用自身的过程称为 递归,调用自身的函数称为 递归函数,用递归方式解决问题的算法称为 递归算法。 函数(方法)调用自身的实现方式有 2 种,分别是: 1) 直接调用自身,例如: 2) 间接调用自身,例如: 程序中,function1() 函数内部调用了 function2() 函数,而 function2() 函数内部又调用了 function1() 函数。也就是

  • 我有一个家庭作业,Java开始计算单词或短语中“a”的实例。我收到以下错误。 异常在线程"main"java.lang.StringIndexOutOfBoundsExctive: String index out of 以下是代码: 我一直在寻找递归问题,并且学到了很多。 然而,我更愿意修复我的代码,而不是仅仅应付别人。 因此,如果有人能告诉我为什么我会收到上述错误,我将不胜感激。

  • 程序调用自身的编程技巧称为递归(recursion),它做为一种算法在程序设计语言中广泛应用。 Java 支持递归,在 Java 编程中,递归是允许方法调用自身调用的属性。调用自身的方法称为是递归的。 递归的典型例子是数字的阶乘。数字 N 的阶乘是 1 到 N 之间所有整数的乘积。例如 3 的阶乘就是 1×2×3。下面的程序使用递归来计算数字的阶乘。 该程序产生的输出如下所示: 3的阶乘是 6 4

  • 问题内容: 我的问题是是否有一些调试复杂的递归算法的聪明方法。假设我们有一个复杂的例子(在每个“嵌套迭代”中递归计数器都减少时,这不是简单的情况)。 我的意思是在可能发生循环时类似图的递归遍历。 我需要检查我是否在某处没有无限循环。而且仅使用调试器执行此操作并不能给出肯定的答案(因为我不确定算法是否处于无限循环中,还是只是按需进行处理)。 没有具体的例子很难解释。但是我需要的是… “要检查复杂的递

  • 请考虑以下类: 注意:很重要的一点是,我不能修改这个类,因为我是从外部API中使用它的。 还要考虑以下订单层次结构: 通过递归地使用(以及一个helper类),我已经设法做到了这一点,如下所示: 这是helper类: 以下一行: 产生以下输出: 到目前为止还不错。结果是绝对正确的。 但是,在阅读了这个问题之后,我对在递归方法中的用法有些担心。特别是,我想知道流是如何被扩展的(如果这是术语的话)。因

  • 我在用递归解迷宫。我的矩阵是这样的 这是更大矩阵的原型。我的求解递归方法如下所示 你们可以注意到,这里我返回一个布尔值,如果我找到一条路径,它应该会给我一个真值。但它总是给我错误的答案。我不确定我在递归方法中犯的逻辑错误。方法如下 endX=3;endY=10;