【问题标题】:Make recursion more efficient in C++在 C++ 中提高递归效率
【发布时间】:2015-07-28 02:03:02
【问题描述】:

我用 C++ 编写了以下递归

#include <iostream>
#include <stdlib.h>
#include <math.h>

#define N 100
using namespace std;


long long int recursion(int array[], int begin,int end, long long int now){
    if(now>N){
        return 0;
    }
    else{
        long long int huge_number=N/now;
        for(int i=1;i<end-begin;i++){
            huge_number=huge_number-recursion(array,begin+i,end,now*array[begin+i]);
        }
        return huge_number;
    }
}

int main(int argc, const char * argv[]) {
    int array[4]={2,3,5,7};
    /*FILE * pFile;
    pFile = fopen ("primes.txt","r");
    for(int i=0;i<78498;i++){
        fscanf(pFile, "%d", &priemen[i]);
    }
    fclose(pFile);*/ 
    //I have actually a txt file with primes less than 10^6
    int number_divisible[4];//this array will contain the desired numbers as explained below
    for(int i=0;i<4;i++){
        number_divisible[i]=N/array[i];
        for(int j=0; j<i;j++){
            number_divisible[i]=number_divisible[i]-recursion(array,j,i,array[i]*array[j]);
        }
    }
    return 0;
}

此代码执行以下操作:例如 N=100。该数组将由最多为 N 平方根的素数组成,因此 array={2,3,5,7}。通过这种递归,我们可以计算出 2 到 100 之间的数有多少是 {2,3,5,7} 中素数 p 的倍数,但不是小于 p 的素数的倍数。

如果我想将它用于巨大的数字 N,比如 10^9,那么程序完成需要太多时间。

我的问题是我们是否可以优化上面给出的代码。如果不能,那么我必须找到一种不同的算法来计算上面解释的所需数字。

【问题讨论】:

  • 编写的代码无法编译。你能包括N的定义吗?是常数吗?
  • @Yakk ,对不起,我没有包含所有代码,以便您可以编译它。我将编辑我的问题并添加必要的代码。
  • 您的标题具有误导性,因为您的问题比优化递归更具体。此外,你没有表现出任何努力自己寻找答案。
  • 你不应该关心递归性能。您需要更高效的算法。
  • 您可能想了解动态规划:qr.ae/R2FpbQ

标签: c++ algorithm recursion


【解决方案1】:

提高递归性能的一种方法是将参数数量减少到所需的最低限度。

另一种方法是用迭代代替递归。这需要算法分析或洞察力。

还有一种方法是降低递归级别。这也需要分析和洞察力。

看了一眼您的代码,通过添加一个数组来跟踪先前计算的值,迭代替换似乎已经成熟了。

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 2013-07-28
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多