C言語関係掲示板

過去ログ

No.256.再帰で数を整数乗


No.1535

関数の再帰呼び出しについて
投稿者---NEPIA(2002/05/19 22:07:37)


こんにちは、今関数の再帰呼び出しについて勉強しています。そこである数を整数乗するプログラムを作りました。
#include<stdio.h>

double power(double x, int n);
main()
{
double x;
int n;

printf("Input x = ");
scanf("%f", &x);
printf("Input n = ");
scanf("%d", &n);
printf("Answer is %lf\n",power( x, n));
}
double power(double x, int n)
{
double a;
if( n == 0 ) return(1);
if(n/2==0)
{
a=power(x, n/2);
a *= a;
}
if(n!=0) a*=x;
return a;
}
このプログラムを実行したところ、n=0のときの値は正常に出るのですがそのほかの値のときは正解が出ません。どうしてなのかどなたかよろしければ教えてください

No.1537

Re:関数の再帰呼び出しについて
投稿者---ジャスミン茶(2002/05/20 13:02:12)


はじめまして、ジャスミン茶です。
私も初心者ですが自分の勉強もかねて答えさせてもらいます。
<PRE>
double power(double x, int n)
{
double a;
if( n == 0 ) // nが0の時の処理として1が返る。
return(1);
if(n/2==0) { // n/2が0である→この時nは1か0である。すなわち1である。
a=power(x, n/2); // つまり1の時しか実行されない。
a *= a; // 実行された場合、n/2==0なのでpower(x,n/2)==1である。よってa==1
}
if(n!=0) // n==0以外のときはa*xをaに代入する。
a*=x; // つまりn>=2の時は再帰されずに関数がいきなり終了してしまう。
return a; // さらに付け加えるとn>=2の時はaが初期化されていないのでまともな答えが出ない。
}</PRE>
こんなもんでどうでしょう?
ついでにxをn乗するプログラムを書いてみました。(全て整数)
<PRE>
#include <stdio.h>
#define SUUJI 9
#define KAISUU 5

int saiki(int x, int n);

main()
{
printf("%d", saiki(SUUJI,KAISUU));
}

int saiki(int x, int n)
{
if (n==0)
return 1;
return x*saiki(x,n-1);
}</PRE>



No.1538

Re:関数の再帰呼び出しについて
投稿者---ジャスミン茶(2002/05/20 13:09:59)


スイマセン、タグ打ちに失敗しました。
何故?

No.1555

Re:関数の再帰呼び出しについて
投稿者---NEPIA(2002/05/20 20:34:03)


ご返事ありがとうございます。一つ一つ説明していただき非常に分かりやすかったです。おかげで解決方法が見つかりました。自分も勉強して資格でも取ろうと思っています。ジャスミン茶さんもC言語がんばってください

No.1556

Re:アドバイスありがとうございます
投稿者---NEPIA(2002/05/20 20:35:58)


ご返事ありがとうございます。一つ一つ説明していただき非常に分かりやすかったです。おかげで解決方法が見つかりました。自分も勉強して資格でも取ろうと思っています。ジャスミン茶さんもC言語がんばってください


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.28
Copyright(c) 2000-2002 TOMOJI All Rights Reserved