试图用c ++中的伪代码编写(divide_recursive算法)

时间:2014-03-28 18:34:41

标签: c++ algorithm pseudocode

我在我的代码中发现此错误的问题,我认为在算法中使用数组作为返回数据类型。我使用数组是因为c ++没有像伪代码那样返回2个变量。 该算法接受输入2整数x和y,并且out输出2个整数q,r(我使用2个元素的数组a [])和商和提醒。

伪代码:

divide(x,y)
    if x = 0: return (q,r) <-- (0,0)
    (q,r) <-- divide(x/2,y)
    q = 2*q, r= 2*r
    if x is odd: r= r+1
    if r>=y: r=r-y, q = q+1
    return(q,r)

c ++代码:

    int  divisione(int x, int y)
    {
      int a[1];
        if(x == 0)
        {
            a[0] = 0;
            a[1] = 0;
            return *a;
        }
        int b[1];
        *b = divisione(x/2,y);
        a[0] = b[0]*2;
        a[1] = b[1]*2;
        if((x%2) != 0)
            a[1] = a[1]+1;
        if(a[1]>= y)
        {
            a[0]+=1;
            a[1]-=y;
        }
        return *a;
    }

2 个答案:

答案 0 :(得分:1)

您的代码存在两个大问题:

  1. 您的数组a的大小为1,而不是2,所以当您访问a[1]时,您正在访问一个不存在的元素,这是未定义的行为

  2. 您只返回数组的第一个元素。这就是*a的含义。

  3. 不要使用数组,只需定义一个与您的伪代码匹配的结构。

    typedef struct {
        int q;
        int r;
    } DivisionResult;
    
    DivisionResult division(int x, int y) {
        DivisionResult result;
        if (x == 0) {
            result.q = result.r = 0;
            return result;
        }
    
        result = division(x/2, y);
        result.q = result.q * 2;
        result.r = result.r * 2;
        if (x % 2 != 0) {
            result.r = result.r + 1;
        }
        if (result.r >= y) {
            result.q = result.q + 1;
            result.r = result.r - y;
        }
        return result;
    }
    

答案 1 :(得分:0)

与返回的2个args一样,尝试将这些变量传递给除by Reference

我建议编写一个带有更像

的签名的函数
void divide(double num1, double num2, double &quotient, double &remainder)
{
    //check args
    remainder = num1 % num2;
    quotient = num1 / num2;
    //the above variables get returned since they were passed **by reference**
}

您还可以创建一个小型数据结构来处理结果,如:

struct DivideResult
{
    //these variables are public by default so you can do '*structname*.function'
    double quotient;
    double remainder;
}

然后你可以返回一个项目,但我仍然建议通过参考解决方案。