【问题标题】:Multiplying using recursive function C++使用递归函数 C++ 进行乘法
【发布时间】:2020-11-22 03:38:44
【问题描述】:

我做了一个递归函数来计算 x*y,其中 x 和 y 都是整数(x 和 y >= 0)。我的公式是: x * y =

  • 0,如果 x 等于 0
  • (x >> 1)*(y ,如果 x 是偶数
  • (x >> 1)*(y ,如果 x 是奇数

“>”是左移和右移位运算符。这是我的代码:

int multiply(int x, int y) {
    int y1 = 0;
    if (x == 0) return 0;
    else if (x % 3 == 0) {
        y1 = y;
        x = x >> 1;
        y = y << 1;
        return (multiply(x, y) + y1);
    }
    else if (x % 2 == 0) {
        x = x >> 1;
        y = y << 1;
        return multiply(x, y);
    }
}

上面的递归函数应该返回 (x*y) 值,但是当我测试时它们都错了,我不知道为什么。我做错了什么?我该如何解决这个问题?

【问题讨论】:

  • x % 3 == 0x 是奇数还是偶数无关。
  • x % 3 不是 n 奇数。它是可被 3 整除的数字的子集
  • 通常使用按位检查奇偶校验 and 是可以接受的,而且速度更快。例如1&amp;1==12&amp;1==03&amp;1==14&amp;1==05&amp;1==1

标签: c++ function recursion multiplication


【解决方案1】:

与自然数相乘相关的递归函数:

int multCool(int a, int b)
{
    return (b==1 ? a: a+ multCool(a,b-1));
}

【讨论】:

    【解决方案2】:

    你的问题是x % 3,如果x = 5 会发生什么?你跳过它。这是您的代码的改进版本。

    int multiply(int x, int y) {
        if (x == 0)
            return 0;
        else if (x % 2 == 1)
            return (multiply(x >> 1, y << 1) + y);
    
        return multiply(x >> 1, y << 1);
    }
    

    或者甚至是这样:

    int multiply(int x, int y) {
        if (x == 0)
            return 0;
        int m = multiply(x >> 1, y << 1);
    
        if (x % 2 == 1)
            m += y;
    
        return m;
    }
    

    这是安迪建议的超快版本:

    int multiply(int x, int y) {
        if (x == 0)
            return 0;
        int m = multiply(x >> 1, y << 1);
    
        if (x & 1)
            m += y;
    
        return m;
    }
    

    作为速度的挑战,这里是非递归版本:

    int multiply (int x, int y) {
        int y1 = 0;
        for (; x > 0; x = (x >> 1), y = (y << 1)) 
            if (x&1) 
                y1 += y;
    
        return y1; 
    }
    

    注意:我知道这个问题是关于递归方法的,但作为一个挑战,我编写了非递归算法。

    【讨论】:

    • if(x&amp;1)if(x%2==1) 还要快
    • @Andy 如果编译器没有将if(x&amp;1)if(x%2==1) 都变成等效的程序集,我会感到非常惊讶。这似乎是不必要的优化。
    • @cigien -- 是的,你可能是对的。但我敢打赌,在 1994 年它可能没有。所以万一你到了那里,你的口袋里就有这个。
    【解决方案3】:

    这是我认为执行递归乘法的最简单方法。 如果它对您来说足够高效,请告诉我。

    #include<iostream>
    using namespace std;
     
    float multiply(float a, float b) {
     
        //no zeros bro
        if (b == 0)
            return 0;
     
        //let the recursion begin
        if (b > 0)
            return x + multiply(a, b - 1);
     
        //negatives stay away pliz
        if (y < 0)
            return -multiply(a, -b);
    }
     
    int main() {
        float a, b, result;
        cout << "Enter the two numbers";
        cin >> a >> b;
     
        result = multiply(a, b);
     
        //And the result is.................
        cout << result;
        return 0;
    }
    

    【讨论】:

    • 我给了你 +1 的答案,但你的方法是 `O(n),其中位移版本是 O(log(n))
    • @0x476f72616e 谢谢,会努力改进它。 :)
    【解决方案4】:

    您没有在此处检查 x 是否正确:

    else if (x % 3 == 0) {  // e.g. fails on x = 1
    

    相反,您需要这样做

    else if (x % 2 == 1) {
    

    这是demo

    请注意,这使得以下else 检查x 的偶数值变得多余:

    else if (x % 2 == 0) {  // can just be an unconditional else
    

    此外,由于您是从 x == 0x % 2 == 1 分支返回的,因此也可以删除 else 条件。您还可以将重复的代码分解出来以使函数更简单,如下所示:

    int multiply(int x, int y) {
        if (x == 0) return 0;
        if (x % 2 == 1) 
            return (multiply(x >> 1, y << 1) + y);
        else 
            return multiply(x >> 1, y << 1); 
    }
    

    这是demo

    【讨论】:

    • @Swift-FridayPie 你能告诉我们你的意思吗?
    • @0x476f72616e 他解决了这个问题。是个偏执狂if
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 2013-11-03
    • 2018-10-16
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2018-06-24
    相关资源
    最近更新 更多