2017-10-20 9 views
1

関数をどのようにして特定のパラメータを静的変数とみなすのかと思いました。例えば、私は、ひょう番号を生成するために、成功せず、試してみました:静的変数として関数パラメータを作成する

#include<stdio.h> 
int hailstone(int); 
int n;       /* n is an extern variable*/ 

int main(){ 
    hailstone(n); 
    return 0; 
} 

int hailstone(int n){ 
    static int m = n;   /*not possible because n is not constant*/ 
    if(m % 2 == 0 && m != 1) 
     hailstone(m /= 2); 
    else if(m != 1) 
     hailstone((m *= 3) + 1); 
    else 
     exit(0);     /*Is the use of exit() correct, in this case?*/ 
    return 0; 
} 

Iは、nを詳しく説明し、静的変数を使用したいと思います。それ以外の場合、各再帰呼び出しはパラメータn全体で動作し、無限に進み、ケースベースに到達することはありません。

いくつかの質問:

  1. このアイデアは問題に実現可能なアプローチを表していますか?
  2. このアイデアは、問題に対するの妥当性/有効性のあるアプローチを表していますか?
  3. exit(0)は、同様の場合に正しく使用されていますか?
+2

'静的int型メートルの必要はありません。しかし、m = n; 'も可能です。 – Bathsheba

+3

再帰関数でグローバル変数を使用すると、再帰のポイントが無効になるため、ソリューションを再考する必要があります。いずれにせよ、あなたの関数は基本ケース(到達できない0以外)を表示しません。あなたの意見では、基本ケースは何ですか?なぜ再帰がそれに到達しないと思いますか? – rici

+0

@ricieは、 'm <1'で表されないケースベースですか?おそらく、最終結果が1になるはずなので、 'm == 1'はより良い基本ケースになる可能性があります。また、私はグローバル変数の問題をどのように乗り越えているかについて正確に迷っていました。 – Worice

答えて

3

このために静的変数は必要ありません。それを操作して使用するには、新しい価値を渡すだけです。また、値1は基本ケースなので、再帰を停止するようにチェックし、実際に何が起こっているかを実際に見ることができるようにnという値を出力します。

void hailstone(int n){ 
    printf("n=%d\n", n); 
    if(n % 2 == 0 && n > 1) { 
     hailstone(n/2); 
    } else if(n > 1) { 
     hailstone((n*3) + 1); 
    } 
} 

この関数がかなりの反復で実行される場合、再帰的な解法はスタックオーバーフローを引き起こす可能性があります。反復解法で行く方が良い:

void hailstone(int n){ 
    while (n > 1) { 
     printf("n=%d\n", n); 
     if(n % 2 == 0) { 
      n = n/2; 
     } else { 
      n = (n*3) + 1; 
     } 
    } 
} 
+0

@riciのコメントのおかげで、私はケースベースを調整しました、ありがとうございます。 – Worice

+1

あなたのコードを少し練習します。二重の例をありがとう。再帰はまだ私にとってはそれほど直感的ではないので、反復的なアプローチと比較することは本当に便利です。 – Worice

1

ここでは雹のための再帰的なアルゴリズムだ、static

#include <assert.h> 
#include <stdio.h> 

void hailstone(unsigned int n) 
{ 
    assert(n>0); 
    printf("%u\n", n); 
    if (n == 1) 
     return; 
    if(n & 1) { 
     hailstone(3*n + 1); 
    } 
    else { 
     hailstone(n >> 1); 
    } 
} 

int main() { 
    hailstone(5); 
} 
+0

あなたの例をお寄せいただきありがとうございます。それは私に問題の良い洞察を与えています! – Worice

関連する問題