2017-03-03 5 views
2

再帰関数の演習をしようとしていて、新しいポインタの知識を適用しようとしています。 ==ポインタを使った再帰関数の使用

  • N場合:運動は、1に戻って、任意の正の数を取得するにはコラッツの問題を使用するために、私たちに求められますが、それは1

    アルゴリズムは以下のとおりであるにその番号からのステップをカウントするように要求しますnは、nは繰り返し奇数の場合、ここで(N * 3)1

上でこのプロセスがintを宣言する私の試みであるN/2

  • にこのプロセスを繰り返し、その後もあれば1
  • を停止カウンターと参照渡し関数に私たちは、それが戻って1にカウントするためにかかった多くの手順数えることができます。

    #include <cs50.h> 
    #include <stdio.h> 
    
    void collatz (int n, int *counter); 
    
    int main (void) 
    { 
        printf("n: "); 
        int n = get_int(); 
        int counter = 0; 
    
        collatz(n, &counter); 
        printf("%i\n",counter); 
    } 
    
    void collatz (int n, int *counter) 
    { 
        if (n == 1) 
        { 
         *counter++; 
         return; 
        } else if (n % 2 == 0) 
        { 
         *counter++; 
         return collatz(n/2, counter); 
        }else if (n % 2 != 0) 
        { 
         *counter++; 
         return collatz((n * 3) + 1, counter); 
        } 
    } 
    

    コンパイルすると、それは私がそれで

    error: expression result unused [-Werror,-Wunused-value] 
          *counter++; 
          ^~~~~~~~~~ 
    
  • +3

    単精度演算子よりも後置演算子の方が優先度が高くなります。また、コンパイラは、 'void'を返す関数内の式で' return'に関する診断を発行しているはずです。 – EOF

    +0

    質問のタイトルがあなたの質問と一致しません。 –

    +2

    '* counter ++;' - >> 'counter + = 1;'はかっこを避けるためのトリックです。 – joop

    答えて

    -1

    Pointerlessバージョン使用していた3回にこのエラーが表示さテール再帰。

    unsigned collatz2(unsigned val) 
    { 
    if (val <= 1) return 0; 
    
    if (val%2) val = val*3 +1; 
    else val /= 2; 
    
    return 1+collatz2(val); 
    } 
    
    関連する問題