【问题标题】:Subtraction of reversed digits with recursion用递归减去反转数字
【发布时间】:2016-07-17 06:03:11
【问题描述】:

我正在尝试以递归方式进行数字减法,假设我有数字 125,然后以这种方式进行减法

    5-2-1 = 2

我已经用递归完成了求和,但我一直在思考它,因为我试图获取每个数字,然后以这种方式在函数本身中减去它

int RecursiveMath::restaDigitos(int n){


   if(n/10 <= 1){
      return 0;
   }else{
    return restaDigitos(n/10) - n%10;
   }

}

我知道这个功能不起作用,但这是我尝试过的许多组合,我觉得我太复杂了,任何帮助/建议将不胜感激!

【问题讨论】:

    标签: c++ recursion digits subtraction


    【解决方案1】:

    您可以简化任务,因为5 - 2 - 1 等于5 - (2 + 1),所以我们可以将除最高位之外的所有数字相加,然后从中减去这个和。

    int subtractDigits(const unsigned int n, const bool first = true){
        if(n == 0){
             return 0;
        }
    
        if(first){
            return n % 10 - subtractDigits(n / 10, false);
        }
        else{
            return n % 10 + subtractDigits(n / 10, false);
        }
    }
    

    【讨论】:

    • 我已经尝试过了,但这是一个非递归的解决方案,我正在尝试使用递归来实现
    • @NeptaliD 等一下,我会尝试制作递归版本
    • @LibertyPaul For 125 这输出 -6
    • 嗯,这个很好......但是当 OP 想要 5 - 2 - 1 = 2 时,计算输入 125 的 1 - 2 - 5 = -6 ;-)
    • 函数完全递归 -> 永不停止
    【解决方案2】:

    AHHH 这个很棘手

    #include <stdio.h>
    int restaDigitos(int n){
        printf("Processing: %d\n", n);
        printf("division: %d\n", n/10);
        if(n==0){
            return 0;
        }else{
            return  n%10 + restaDigitos(n/10);
        }
    }
    
    int main() {
        int input = 125;
        int firstVal = input % 10;
    
        int result = restaDigitos(input / 10);
        printf("result: %d\n", firstVal - result);
    }
    

    做了两个主要的更正:

    1. 您的终止条件忽略了最后一个保留单个数字的情况,因此提前终止
    2. 第一个值不能递归,因为它是正数。 (5-2-1) -> 第一个数字 5 是正数,而其他值是负数

    希望这有帮助!

    【讨论】:

      【解决方案3】:

      问题是您还减去了最后一个数字 (0 - 1 -2 - 5),但从我从您的问题中可以看出,您想要添加它 (0 - 1 -2 + 5)。我的解决方案是添加另一个参数来指定位数,以便您知道何时添加而不是减去

      int RecursiveMath::restaDigitos(int n, int numDigits){
          if (n ==  0) {
              return 0;
          } else if (n / (pow(10, numDigits - 1)) >= 1){
              return restaDigitos(n/10, numDigits) + n % 10;
          } else {
          return restaDigitos(n / 10, numDigits) - n % 10;
         }
      }
      

      【讨论】:

      • 天哪, pow() 会将 int 转换为 double。效果太差了!
      【解决方案4】:

      您处理第一个值的方式与其他值不同。这样的用例会导致棘手的递归方式,即使用默认参数或静态值作为一次性解决方案。

      你可以在这里使用:

      int restaDigitos(int val, bool first = true, int curr = 0) {
          if (val == 0) return curr;
          if (first) curr = val%10;
          else curr -= val%10;
          return restaDigitos(val/10, false, curr);
      }
      

      你可以控制restaDigitos(125);按预期给出2。

      【讨论】:

      • 传递bool first 标志是多余的。您可以通过除以 10 来检查它。
      猜你喜欢
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      相关资源
      最近更新 更多