• 締切済み

再帰処理 変換

初歩的で申し訳ないのですが、10進数を2進数に変換して表示する関数dt(n)を再帰的に定義するプログラムを作ってみたのですがつまってしまいました。以下、考えたコード文です。 #include <stdio.h> /*****dt*******/ long dt(int n) {      if(n == 1)          printf("1");      else          dt(n % 2);          printf("%d" , n); } /****** Main ******/ void main(void) {      dt(10); } どこが間違えているかご指摘頂けたら有難いです。

みんなの回答

回答No.2

このプログラムには間違いがいくつかあります。 間違い1  dtはlong型の値を返すとなっているが、return文がない。 <対策>  dtは戻り値を返す必要はないので、voidで宣言する  long dt(int n) → void dt(int n) 間違い2  if文のelse節に複数文を書くときは{}でくくる。 {}を省略すると1文のみ有効になる  これはthen節(条件が成立したときに実行する部分)も同じだが、今回then節には1文しかないので省略可能(でも私的には省略したくありません)  <対策>   else節を{}でくくる   if(n == 1)          printf("1");      else          dt(n % 2);          printf("%d" , n); を   if(n == 1)          printf("1");      else{          dt(n % 2);          printf("%d" , n); } 間違い3  出力するのは2で割った余り(筆算で10進数を2進数に変換するときは余りを使いますよね)  従って   printf("%d" , n); →printf("%d" , n%2); 間違い4  再帰呼び出し時に渡すものは2で割った答え(筆算で10進数を2進数に変換するときは答えを2で割っていくことを繰り返しますよね)  従って   dt(n % 2); → dt(n / 2); 以上を修正すれば上手くいくと思います。  

すると、全ての回答が全文表示されます。
回答No.1

>どこが間違えているかご指摘頂けたら有難いです。 「n % 2」で求められる解(余り)は「0」か「1」 10(10)=1010(2)なら、  「n=10」なのでelseを実行→「n%2」で「0」を渡す→elseを実行(以下略)の無限ループ 11(10)=1011(2)なら、  「n=11」なのでelseを実行→「n%2」で「1」を渡す→ifを実行して終了 となる。 「2で割った余り」ではなく「2で割った商」を0になるまで与えていく。

すると、全ての回答が全文表示されます。

関連するQ&A