RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 843059
Accepted
Oleg Khegay
Oleg Khegay
Asked:2020-06-17 17:16:28 +0000 UTC2020-06-17 17:16:28 +0000 UTC 2020-06-17 17:16:28 +0000 UTC

用递归乘以数字

  • 772

我试图了解递归是如何工作的。以下是如何使用循环将两个数字相乘的示例:

public int mult(int a, int b){
    int sum=0;
    for (int i=0;i<b;i++){
        sum+=a;
    }
    return sum;
}

请告诉我如何使用递归重新制作这个循环?(仅使用加法)

java
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    Arhadthedev
    2020-06-17T17:43:39Z2020-06-17T17:43:39Z

    前额的解决方案非常简单,但即使在这里也有必要考虑到 rake 的存在:

    private int mult_step(int summand, int steps_count){
        if (steps_count > 0)
            return summand + mult(summand, steps_count - 1);
        else
            return 0;
    }
    
    public int mult(int a, int b){
        int summand, steps_count;
        Boolean negate;
        if(a > b){
            summand = a;
            steps_count = Math.abs(b);
            negate = (b < 0);
        } else{
            summand = b;
            steps_count = Math.abs(a);
            negate = (a < 0);
        }
    
        int sum = mult_step(summand, steps_count);
        return negate ? -sum : sum;
    }
    

    也就是说,首先我们深入到b元素的链中,然后我们开始往回爬,积累总和。

    让我解释一下我们谈论的是哪种耙子:

    1. 乘数可以是负数。如果不考虑这一点,就会出现无限递归。

    2. 对于大b,链将比堆栈可以容纳的更长。因此,应取最小的因素作为链的长度。

    • 3
  2. vp_arth
    2020-07-15T13:37:16Z2020-07-15T13:37:16Z

    与快速求幂算法类似,它是可能的:

    public static int mul(int a, int b){
        if (b < 0) return -mul(a, -b); // обработка отрицательных значений
        if (b == 1) return a;          // тривиальные условия выхода 
    
        if ((b & 1) == 1)  return a + mul(a, b-1); // обработка нечётных
        return mul(a, b >> 1) << 1;                // логарифмический спуск на чётных
    }
    

    js上的工作演示:

    function mul(a, b) {
      if (b < 0) return -mul(a, -b);
      if (b == 1) return a;
      if ((b&1) == 1)  return a + mul(a, b-1);
      return mul(a, b >> 1) << 1;
      // за счёт деления на 2 мы получаем всего logN итераций
    }
    
    [
      [2, 7],
      [3, 8],
      [-13, -17],
    ].forEach(([a, b]) => console.log(
      a, b, 
      mul(a, b), 
      mul(a, b) === a*b
    ));

    • 1
  3. And
    2020-06-17T17:26:52Z2020-06-17T17:26:52Z

    也可以这样:

    int mult(int min, int max) {
        if (min == max) {
            return max;
        }
        return mult(++min, max);
    }
    

    但这一切都取决于你需要做什么样的操作。

    • -2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5