2016-11-02 6 views
1

Also, für meine Aufgabe, soll ich eine Funktion, die 2 nicht vorzeichenbehaftete Argumente und ihre Produkte ausgibt. , /, * Oder% Operatoren -Multiplikation mit nur rekursive Funktionen und Inkrementierung in C

unsigned multiply(unsigned a, unsigned b); 

Zum Beispiel

multiply(3, 4) 

zurückkehren sollte 12

Die Sache ist, ich bin nicht +, zu benutzen. Ich darf nur Funktionen aufrufen und mit ++ und - inkrementieren/dekrementieren.

Ich habe eine andere Funktion bereits zwei Argumente hinzuzufügen:

unsigned add(unsigned a, unsigned b) 
{ 
    if (a > 0) 
     add(--a, ++b); 
    else return(b); 
} 

und ich bin dies zu nennen erlaubt, zusammen mit irgendwelchen Hilfsfunktionen ich brauche.

Ich habe die letzten 30 Minuten damit verbracht, verschiedene Permutationen auszuprobieren, aber ich kann die Mathematik nicht richtig machen; Das nächste, was ich je bekommen habe, ist, dass ich mich b mal verdopple, aber das wird es nicht schneiden. Irgendwelche Ideen?

Edit: Vergessen zu erwähnen! Für/While-Schleifen sind nicht erlaubt entweder

Antwort

2
unsigned add(unsigned a, unsigned b){ 
    if (a > 0) 
     return add(--a, ++b); 
    else 
     return b; 
} 
unsigned multiply(unsigned a, unsigned b){ 
    if(a > 0) 
     return add(b, multiply(--a, b)); 
    else 
     return 0; 
} 
+1

Aha! Ich musste die Sekunde (a> 0) zu (a> 1) ändern, aber das funktioniert gut! Danke –

+0

In diesem Fall, was passiert mit den Ergebnissen von "multiplizieren (0, 5)"? – BLUEPIXY

0

ich es nicht kompiliert haben aber i`m seine sicher

mutiply(3, 4, 0) 

int mutiply(int a, int b, int result) { 
    if(a > 0) { 
    for(int i=1;i<=b;i++) 
     result++ 
    mutiply(--a, b, result); 
    } else return (result == 0 && a == 0) ? 0 : result; 
} 
+0

'multiplizieren (3, 4)' unterscheidet Signatur als 'int multiplizieren (int a, int b, int result)' – BLUEPIXY

+0

Leider vergessen zu bearbeiten hehe – HuntsMan

1
int multiply (int a, int b) 
{ 
    int result = 0; 
    for (int i = 0; i < a; i++) { //You repeat "a" times... 
     for (int j = 0; j < b; j++) { //...adding "b" to result. 
      result++; 
     } 
    } 
    return result; 
} 

Natürlich arbeiten, wenn Rekursivität obligatorisch ist, wird dies nicht funktioniert.

+0

Yeah ich vergaß zu erwähnen, es muss rekursiv und For-Schleifen sind nicht erlaubt –

0

Hier ist eine Tail-rekursive Lösung, die eine Hilfsfunktion mit einem Akkumulator verwendet. Dies ist im Wesentlichen die gleiche wie die Lösung nested for Loops:

unsigned multiply(unsigned a, unsigned b) 
{ 
    return mult_helper(a, b, 0, a); 
} 

unsigned mult_helper(unsigned a, unsigned b, unsigned acc, unsigned reset) 
{ 
    if (b == 0) 
     return acc; 
    if (a > 0) 
     return mult_helper(--a, b, ++acc, reset); 
    return mult_helper(reset, --b, acc, reset); 
}