C言語関係掲示板

過去ログ

No.485.べき乗を計算する(再帰を使うものと使わないもの)

[戻る] [ホームページ]
No.3534

お願いします。
投稿者---Gackt(2002/11/21 16:59:31)


べき乗(xのy乗)をg(x,y)とし、xは実数、yは正の整数とします。

g(x,y)=1 (y=0のとき)
g(x,y)=g(x*x, y/2) (yが偶数のとき)
g(x,y)=g(x*x, (y-1)/2) (yが奇数のとき)

この定義を使いべき乗を計算する再帰関数を使ったものと使ってないもの
のプログラムをつくりたいです。よくわからないので、お願いします。

No.3535

Re:お願いします。
投稿者---かずま(2002/11/21 18:38:06)


> べき乗(xのy乗)をg(x,y)とし、xは実数、yは正の整数とします。
>
> g(x,y)=1 (y=0のとき)
> g(x,y)=g(x*x, y/2) (yが偶数のとき)
> g(x,y)=g(x*x, (y-1)/2) (yが奇数のとき)

これに従うと、3の1乗は 1 になりますね。プログラム以前の問題です。
この問題は、どこから持ってきたのですか。

それから、掲示板のトップの「掲示板ご利用上の注意」は読んでいますか。
「お願いします。」というのは不適切なタイトルです。

なお、これに類似した問題のプログラムは「過去ログ」にあります。

No.3581

題名変更
投稿者---Gackt(2002/11/26 16:52:14)


>> g(x,y)=x*g(x*x, (y-1)/2) (yが奇数のとき)

です。忘れていました。過去ログをみたんですが、始めたばかりなのでよく分かりません。& >> がわかりません。これをを使わないプログラムはどうなるのですか。(題名を変えます。すいません。)


No.3584

Re:題名変更
投稿者---かずま(2002/11/26 19:35:01)


タイトルは、内容を表すものを書いてください。
この場合だったら、「べき乗の計算」。
再帰版
double g(double x, int y)
{
    if (y == 0)
        return 1;
    if (y % 2 == 0)
        return g(x * x, y / 2);
    return x * g(x * x, (y - 1) / 2);
}

ループ版
double g(double x, int y)
{
    double z = 1;

    while (y != 0) {
        if (y % 2 == 0) {
            x *= x;  y /= 2;
        } else {
            z *= x;  x *= x;  y = (y - 1) / 2;
        }
    }
    return z;
}