2016-11-13 25 views
1

再帰を使用して2桁の数字の合計を返そうとしています。私のアルゴリズムはOKだと思いますが、私はポインタではあまりよくありません。mainで宣言された変数を指していて、それらが0であると宣言したときに、なぜ変わった値が宣言されているのかわかりません。ここでC recursion returns 2 values

は私のコードです:

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()を書き換えて1つの数値だけを処理し、次にget_sums()を2回呼び出します。次に、get_sumsの戻り値を使用して項目を追加できます。 –

答えて

2

あなたは複数の問題を抱えて:あなたは1あなたは、ポインタデリファレンスない

  • を十分であろう間接の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