C言語初心者です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
naka

C言語初心者です。

#1

投稿記事 by naka » 15年前

C言語・リカーシブコールを使っての関数を作りたいですが・・・

初めて質問させていただきます。

私は今、C言語の勉強中で、
リカーシブコール(再帰び出し)を勉強中です。

以下に書かせていただいた問題を解いているのですが
うまくいきません。
このpower関数の定義部分を再帰呼び出しを使って書き直したいです。

大変申し訳ないのですが、初心者のためここがわからない、という
的確なことが言えません・・・
自分で作ってみたソースでコンパイルしてみたところ、
最後の%d乗のところがうまく出せません。


うまくコンパイルできるソースがお分かりの方いらっしゃいましたら
ぜひ教えていただきたいです。


恐れ入りますが、よろしくお願い致します。




問題:
xのy乗を返す関数int power(int x,int y)を作成し、
次のようにキーボードから入力して計算を行うコードを入力してください。
***************************************************
1番目の整数を入力してください。(1~5)
2←(キーボードから入力)
2番目の整数を入力してください。(1~5)
3←(キーボードから入力)
2の3乗は8です。

***************************************************
(再帰呼び出しをせずに作ったソースです↓)

#include <stdio.h>

/*power関数の宣言*/
   int power(int x, int y);

   int main(void)
   {
   int num1,num2,ans;


   printf("1番目の整数を入力してください。\n");
   scanf("%d", &num1);

   printf("2番目の整数を入力してください。\n");
   scanf("%d", &num2);


   ans = power(num1,num2);

   printf("%dの%dは%dです。\n", num1,num2,ans);

   return(0);
   }

/*power関数の定義*/
   int power(int x, int y)
   {
   int a;
   int i;

   a = x;

   for(i=1;i<y;i++){
    a = a * x;
   }
   return a;
   }



よろしくお願い致します。

MNS

Re:C言語初心者です。

#2

投稿記事 by MNS » 15年前

>自分で作ってみたソースでコンパイルしてみたところ、
>最後の%d乗のところがうまく出せません。

まずは、自分で書いてみたコードを提示してみてください。
そうすれば、nakaさんの再帰呼び出しに対する理解の誤りが分かるかも知れません。

naka

C言語初心者です。

#3

投稿記事 by naka » 15年前

ご指摘ありがとうございます。
そして迅速に対応していただき感謝しております。


私が考えていたものはこちらです。

int power(int x,int y)
{
int a;
a = x;

if(y == 1){
return a;
}

else{
   power(x,y-1);
}

単純にaを返すだけでは全然違うことはわかっているつもりですが
どう表わしたらいいかがどうしてもわかりませんでした。

Poco

Re:C言語初心者です。

#4

投稿記事 by Poco » 15年前

提示されたソースは再帰呼び出しになっていません。
取り敢えず、power関数を「日本語で」定義して見てください。
以下のような形式で。

「関数power(x,y)は〇〇という計算を行う関数である。」

この〇〇というところに関数powerが入っていれば、再帰的定義となります。
nakaさんが提示されたコードでは
「関数power(x,y)はxをy回掛けるという計算を行う関数である。」
になっています。再帰的定義ではありません。

#何らかの授業でやっているのなら、例題も出ているはずです。
#それも同様に再帰的定義をやってみてください。

Poco

Re:C言語初心者です。

#5

投稿記事 by Poco » 15年前

> 私が考えていたものはこちらです。
>
> int power(int x,int y)
> {
> int a;
> a = x;
>
> if(y == 1){
> return a;
> }
>
> else{
>    power(x,y-1);
> }
>
> 単純にaを返すだけでは全然違うことはわかっているつもりですが
> どう表わしたらいいかがどうしてもわかりませんでした。

惜しい。
power(3,1)って3ですよね?
power(3,2)って3*3ですよね?
power(3,3)って3*3*3ですよね?
power(3,4)って3*3*3*3ですよね?

では、power(3,n)はどうなりますか?

MNS

Re:C言語初心者です。

#6

投稿記事 by MNS » 15年前

もっと直接的な考えで言うと、

power(x,y) = k * power(x,y-1)

という式で、kの値が何になるかを考えてみると、
この式がそのまま再帰で使えることが分かるはずです。

naka

Re:C言語初心者です。

#7

投稿記事 by naka » 15年前

ありがとうございます。

power(3,n)は・・・
3をn回繰り返してかけていくんですよね・・・
3*3*3*3*3.....

3かけることをn-1回繰り返してます。
せっかく教えていただいたのに申し訳ないです。

naka

Re:C言語初心者です。

#8

投稿記事 by naka » 15年前

> power(x,y) = k * power(x,y-1)
>
> という式で、kの値が何になるかを考えてみると、
> この式がそのまま再帰で使えることが分かるはずです。



少し考えてみます。
ありがとうございました。

box

Re:C言語初心者です。

#9

投稿記事 by box » 15年前

> 3かけることをn-1回繰り返してます。

この方法にとらわれている限り、for文による繰り返しから
脱却できないでしょう。

閉鎖

“C言語何でも質問掲示板” へ戻る