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

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

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

●関数の再帰呼び出し(recursive call)により、2のべき乗を計算するプログラムです。
●乗数のカウンタと計算結果は、変数のアドレスを引数として関数に渡します。
※グローバル変数を使うプログラム例は、2のべき乗(関数の再帰呼び出し)(2)
 あります。
●途中経過を表示するために、printf文を入れています。
 ≫ソースファイルのダウンロード: beki10.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(long*,int*);                       // 2倍を繰り返す


void  main( )
/*----------------*/
/*  主プログラム  */
/*----------------*/
{
   char   c[128];
   int    n,i;                                 // 乗数n,カウンタ
   long   m=1;                                 // 2のn乗

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

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

   i=n;

   beki2(&m,&i);                               // 2倍を繰り返す

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


void  beki2(
/*------------------*/
/*  2倍を繰り返す  */
/*------------------*/
long  *m,     // べき乗
int   *i)     // カウンタ
{
    printf("\nm=%d",*m);                       // 途中経過表示

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

※SSL暗号化通信対応

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