用递归减去反转数字

时间:2016-03-29 15:19:19

标签: c++ recursion digits subtraction

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

rosbuild_add_executable

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

    5-2-1 = 2

我知道这个功能不起作用,但它是我尝试过的很多组合,我觉得我太复杂了,任何帮助/建议都会受到高度赞赏!

4 个答案:

答案 0 :(得分:2)

您可以简化任务,因为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);
    }
}

答案 1 :(得分:0)

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) - &gt;第一个数字5为正,而其他值为负数
  3. 希望这有帮助!

答案 2 :(得分:0)

问题是你也减去了最后一个数字(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;
   }
}

答案 3 :(得分:0)

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

您可以在这里使用:

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。