2016-11-13 69 views
1

我想使用遞歸返回2個數字的數字的總和。我認爲我的算法沒問題,但是我對指針不太熟悉,而且我不明白他們爲什麼在指向main中聲明的變量並且它們是0時顯示奇怪的值(如變量未聲明時)。C遞歸返回2個值

這裏是我的代碼:

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

做什麼,如果數字有數字的不同數字? –

+0

我之前解決過這個問題,他們總是會有相同數量的數字,例如硬編碼數值。我只需要遞歸幫助。 – Teemo

+1

更簡單的解決方案是重寫get_sums()來處理一個數字,然後調用get_sums()兩次。然後你可以使用get_sums的返回值來加起來。 –

回答

2

您有多個問題:

  • 您正在使用2個間接

    ,其中一個就足夠了

  • 你不取消引用指針將值傳遞給printf

  • 您應該遞歸地傳遞指針而不是地址,而是使用結果的地址調用該函數。

  • 你應該遞歸直到兩個號碼完全消滅

  • ,你應該能編譯器更多的警告,以幫助您避免這樣的錯誤:gcc -Wall例如。

這裏是一個修正版本:

#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

謝謝!非常好的解釋! – Teemo

1

你不必通過指針傳遞指針:)

考慮到該函數將始終返回0

它可以看下面的方式

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

程序輸出是

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