C ++ - 递归程序,分而治之

时间:2017-12-14 22:19:28

标签: c++ recursion

我必须在c ++中开发以下递归程序。

程序使用偶数矢量,并具有以下形式。

[a,n,d,f]

算法必须使用分而治之。

算法的想法如下,你必须比较和确定有多少对。

例如,使用最后一个向量,我必须计算其上有效夫妻的数量,不包括那些包含" n"信。

对于向量[a,n,d,f],我们只有两对,第一对是[a,n],第二对是[d,f],对[n,d] isn'使用了,所以这个向量的结果应该是一个。

具有以下向量的另一个例子[a,b,n,d,e,f],这对夫妇是[a,b] - > 有效 [n,d] - > 无效和[e,f] - > 有效,结果为2,情侣[b,n] [n,d] [d,e]不是问题夫妻。

根据它的大小,问题的唯一有效夫妻应该是 v [0]与v [1] v [2]与v [3] 。 .. v [n-1] v [n]

这是我的方法,使用分而治之,将计算有效数字的夫妻,但我真的不知道如何集中它。

struct Solucion {
  int suma = 0;
  bool ok = false;
};

Solucion sum (vector<string>const &v, int ini, int fin) {
    Solucion sol,der,izq;

    if(ini==fin) {//Ningún elemento
        sol.suma = sol.suma;
    }else if (ini+2 == fin) { //2 elementos
        if (v[ini] != "n" && v[ini+1] != "n") {
            sol.suma = sol.suma + 1;
        }
    }
    else{ //vector 2 elementos
        int m = (ini + fin + 1) / 2;


        /*cout << "fin " << fin << endl;
        cout << "ini " << ini << endl;*/

        if (v[m] != "n" && v[m+1]!= "n" && (fin-m)==2) { //caso 2 elemtos
            sol.suma = sol.suma + 1;
        }else if (v[m] != "n" && v[m+1]!= "n" && (fin-m)==1){
            sol.suma = sol.suma + 1;
        }else {
            izq = sum(v,ini,m);
            der = sum(v,m,v.size());
        }
        sol.suma = der.suma + izq.suma;
    }


    return sol;
}

我不知道何时调用递归,左侧( izq )或右侧( der )情况。

这是我的在线代码: https://repl.it/repls/FlashyFrivolousWeaverbird

1 个答案:

答案 0 :(得分:1)

你在评论中提到“失去总和的价值”。使用递归保持运行总计的一种方法是返回下一个函数调用的结果以及当前函数调用所贡献的内容。

例如,如果我们想要计算向量中的偶数:

int sum (vector<int>const &v, int ini, int fin) {
    if(ini >= fin) return 0; //if there's nothing to count, there's no evens
    if(v.at(ini) % 2 == 0) { //even num
        return sum(v, ini+1, fin) + 1; //we found one so add the rest + 1
    } else { //odd num
        return sum(v, ini+1, fin); //just return the sum of the rest, we have nothing to contribute
    }
}