2016-11-13 3 views
1

Ich versuche, Summen von Ziffern von 2 Zahlen Rekursion zurückzugeben. Ich denke, mein Algorithmus ist in Ordnung, aber ich bin nicht so gut mit Zeigern und ich verstehe nicht, warum sie seltsame Werte zeigen (wie wenn Variable nicht deklariert ist), wenn sie auf main deklarierte Variablen zeigen und sie 0 sind.C Rekursion zurück 2 Werte

Hier ist mein Code:

int get_sums(int **fp, int **sp, int n1, int n2) { 
    printf("fp: %d\n", fp); 
    printf("sp: %d\n", sp); 
    printf("n1: %d\n", n1); 
    printf("n2: %d\n", n2); 

    if (n1 == 0) { 
     return 0; 
    } 

    *fp += (n1 % 10); 
    *sp += (n2 % 10); 

    return get_sums(&fp, &sp, n1/10, n2/10); 
} 

int main(void) { 
    int f = 0, s = 0; 
    int *fp = &f; 
    int *sp = &s; 
    int first = 123, second = 456; 

    get_sums(&fp, &sp, first, second); 
    printf("First sum: %d\nSecond sum: %d\n", *fp, *sp); 
    return 0; 
} 
+0

Was tun, wenn die Zahlen eine unterschiedliche Anzahl von Ziffern haben? –

+0

Ich löste dieses Problem vorher, sie haben immer die gleiche Anzahl von Ziffern, hardcoded Zahlenwerte nur zum Beispiel. Ich brauche nur Hilfe bei meiner Rekursion. – Teemo

+1

Eine einfachere Lösung wäre es, get_sums() so umzuschreiben, dass sie nur eine Zahl behandelt, und dann get_sums() zweimal aufzurufen. Dann können Sie den Rückgabewert von get_sums verwenden, um Dinge zu addieren. –

Antwort

2

Sie haben mehrere Probleme:

  • Sie 2 Dereferenzierungsebenen mit dem man

  • dereferenzieren den Zeiger Sie nicht ausreichen würde Übergeben Sie die Werte an printf

  • Sie sollten die Zeiger nur rekursiv anstelle ihrer Adressen übergeben, aber die Funktion mit den Adressen der Ergebnisse aufrufen.

  • Sie Rekursion sollte, bis beide Zahlen vollständig

  • dezimiert werden, sollten Sie mehrere Warnungen für den Compiler ermöglichen Ihnen solche Fehler zu vermeiden helfen: gcc -Wall zum Beispiel.

Hier ist eine korrigierte Version.

#include <stdio.h> 

void get_sums(int *fp, int *sp, int n1, int n2) { 
    printf("fp: %d\n", *fp); 
    printf("sp: %d\n", *sp); 
    printf("n1: %d\n", n1); 
    printf("n2: %d\n", n2); 

    if (n1 == 0 && n2 == 0) { 
     return; 
    } 

    *fp += n1 % 10; 
    *sp += n2 % 10; 

    get_sums(fp, sp, n1/10, n2/10); 
} 

int main(void) { 
    int f = 0, s = 0; 
    int first = 123, second = 456; 

    get_sums(&f, &s, first, second); 
    printf("First sum: %d\nSecond sum: %d\n", f, s); 
    return 0; 
} 
+0

Danke! Sehr schöne Erklärung! – Teemo

1

Sie müssen nicht die Zeiger durch Zeiger passieren :)

berücksichtigen, dass die Funktion immer 0 zurück

Es kann folgendermaßen aussehen:

#include <stdio.h> 

void get_sums(int *fp, int *sp, int n1, int n2) 
{ 
    printf("fp: %d\n", *fp); 
    printf("sp: %d\n", *sp); 
    printf("n1: %d\n", n1); 
    printf("n2: %d\n", n2); 

    if (n1 != 0 && n2 != 0) 
    { 
     *fp += (n1 % 10); 
     *sp += (n2 % 10); 

     get_sums(fp, sp, n1/10, n2/10); 
    } 
} 

int main(void) 
{ 
    int f = 0, s = 0; 
    int *fp = &f; 
    int *sp = &s; 

    int first = 123, second = 456; 

    get_sums(fp, sp, first, second); 
    printf("First sum: %d\nSecond sum: %d\n", *fp, *sp); 
    return 0; 
} 

Die Programmausgabe ist

fp: 0 
sp: 0 
n1: 123 
n2: 456 
fp: 3 
sp: 6 
n1: 12 
n2: 45 
fp: 5 
sp: 11 
n1: 1 
n2: 4 
fp: 6 
sp: 15 
n1: 0 
n2: 0 
First sum: 6 
Second sum: 15