2016-03-29 3 views
0

я пытаюсь сделать вычитание цифр рекурсивным образом, позволяет сказать, что у меня есть число 125, то вычитание происходит делать это таким образомВычитания отмененных цифры с рекурсией

5-2-1 = 2 

I» ве уже сделал сумму с рекурсией, но я застрял думать об этом, потому что я пытаюсь получить каждую цифру, а затем вычесть его внутри самой функции таким образом

int RecursiveMath::restaDigitos(int n){ 


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

} 

Я знаю, эта функция не работает, но это то, что я пробовал вместе со многими комбинациями, я чувствую, что тоже усложняю много, любая помощь/совет были бы высоко оценены!

ответ

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); 
    } 
} 
+0

Я уже пробовал это, но это нерекурсивна решение, я пытаюсь это сделать с рекурсией – NeptaliD

+0

@NeptaliD ждать минуту, я постараюсь сделать рекурсивную версию – LibertyPaul

+0

@NeptaliD нормально, теперь она готова :) – LibertyPaul

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) -> Первое число 5 является положительным, тогда как другие значения отрицательны.

Надеюсь, это помогло!

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; 
    } 
} 
+1

О, мой бог, pow() заставит int удвоить. Это так неэффективно! – LibertyPaul

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.

+0

Это лишний, чтобы передать флаг 'bool first'. Вы можете проверить его, разделив его на 10. – LibertyPaul

+0

@LibertyPaul: Это, безусловно, избыточно, но проще и безопаснее ... –

Смежные вопросы