2016-03-29 9 views
0

Ich versuche, eine Subtraktion von Ziffern in einer rekursiven Weise zu tun, kann sagen, dass ich die Nummer 125 dann die Subtraktion stattfindet, es auf diese Weise tutSubtraktion umgekehrt Ziffern mit Rekursion

5-2-1 = 2 

I‘ habe bereits die Summe mit Rekursion getan, aber ich bin fest, darüber nachzudenken, weil ich jede Stelle zu bekommen bin versucht, und dann auf diese Weise subtrahiert sie innerhalb der Funktion selbst

int RecursiveMath::restaDigitos(int n){ 


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

} 

ich weiß, diese Funktion nicht funktioniert, aber Es ist, was ich mit vielen Kombinationen versucht habe, ich fühle mich, als würde ich es komplizieren zu viel, jede Hilfe/Beratung wäre sehr willkommen!

Antwort

2

Sie können die Aufgabe vereinfachen, weil 5 - 2 - 1 gleich 5 - (2 + 1) ist, also können wir alle Ziffern außer der höchsten Summe addieren und diese Summe davon subtrahieren.

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

ich schon versucht habe erwartet gibt, dass aber es ist eine nicht-rekursive Lösung, ich versuche, es zu tun mit Rekursion – NeptaliD

+0

@NeptaliD warten Sie eine Minute, ich werde versuchen, rekursive Version machen – LibertyPaul

+0

@NeptaliD ok, jetzt ist es fertig :) – LibertyPaul

0

AHHH Dieser war heikel

#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); 
} 

Zwei wichtige Korrekturen vorgenommen wurden:

  1. Ihre Abbruchbedingung wurde der letzte Fall zu vernachlässigen, wo eine einzelne Ziffer bleibt so beendet es früh
  2. Der erste Wert kann nicht rekursiv sein, weil er positiv ist. (5-2-1) -> Die erste Zahl 5 ist positiv, während die anderen Werte negativ sind

Hoffe, dass dies geholfen hat!

0

Das Problem ist, dass Sie auch die letzte Zahl (0 - 1 -2 - 5) subtrahieren, aber von was ich von Ihrer Frage erzählen kann, möchten Sie es hinzufügen (0 - 1 -2 + 5). Meine Lösung ist ein weiteres Argument, die die Anzahl der Stellen hinzuzufügen, so dass Sie wissen, wann

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

Oh mein Gott, der pow() wird int zu verdoppeln. Es ist so unwirksam! – LibertyPaul

0

Sie bearbeiten den ersten Wert unterschiedlich, dass die anderen statt subtrahieren hinzuzufügen. Ein solcher Anwendungsfall führt zu komplizierten Rekursionsarten, bei denen Standardparameter oder statische Werte für One-Shot-Lösungen verwendet werden.

Hier könnten Sie:

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

können Sie steuern, dass restaDigitos(125); als 2.

+0

Es ist überflüssig, 'bool first' Flag zu übergeben. Sie können es überprüfen, indem Sie durch 10 dividieren. – LibertyPaul

+0

@LibertyPaul: Es ist sicherlich redundant, aber einfacher und sicherer ... –