1989年開業 技術士 佐伯英子(情報工学部門) 文部科学省登録番号 第22082号 日本技術士会会員 東大阪商工会議所会員

≫サンプルプログラム一覧 

オープンソース/C言語サンプルプログラム  2のべき乗(関数の再帰呼び出し) (2)

●関数の再帰呼び出し(recursive call)により、2のべき乗を計算するプログラムです。
●乗数のカウンタと計算結果はグローバル変数です。
※引数を渡すプログラム例は、2のべき乗(関数の再帰呼び出し)(1) にあります。
●途中経過を表示するために、printf文を入れています。
 ≫ソースファイルのダウンロード: beki11.c

※2の0乗が1になる理由は、こちらを参考にしてください。
 ≫事務所blog記事「0乗,1乗,2乗,べき乗について」
 ≫事務所blog記事「0乗は1の理由=1に何も掛けないから」

【問題】
●途中経過にカウンタiの値も表示するよう変更し、再帰呼び出しの理解を深めよう。
●途中経過を表示するprintf関数の位置を、if文の後に移動するとどうなるか考え、
 検証してみよう。
●乗数nに負の数を入力するとどうなるか考え、検証してみよう。
●乗数nに31を入力するとどうなるか考え、検証してみよう。
   ヒント:2の31乗を2進数で記述すると分かりやすい。
●乗数nに32以上の数を入力すると、結果が0になるのはなぜか考えてみよう。

/**************************/
/*  2のべき乗を計算する  */
/* (関数の再帰呼び出し) */
/* (グローバル変数使用) */
/**************************/
#include <stdio.h>
#include <stdlib.h>

void  beki2(void);                             // 2倍を繰り返す
int   i;                                       // 乗数カウンタ
long  m;                                       // 2のn乗


void  main( )
/*----------------*/
/*  主プログラム  */
/*----------------*/
{
   char   c[128];
   int    n;                                   // 乗数n

   printf("\n\n\n★2のべき乗(整数)★\n");

   printf("\n何乗しますか: "); fflush(stdout);
   gets(c); n=atoi(c);                         // キーボードから入力

   m=1; i=n;                                   // 初期値

   beki2( );                                   // 2倍を繰り返す

   printf("\n\n【結果】2 の %d 乗は %ld です\n\n",n,m);
}


void  beki2( )
/*------------------*/
/*  2倍を繰り返す  */
/*------------------*/
{
    printf("\nm=%d",m);                        // 途中経過表示

    if ( i>=1 )                                // iの値が1以上のとき
      {
        m*=2; i--;
        beki2( );                              // 2倍を繰り返す
      }
}
   

※SSL暗号化通信対応

佐伯英子技術士事務所 〒542-0073 大阪市中央区日本橋 1-14-13 サンオフィス日本橋601  E-mail: yfb22332@nifty.com