プロが教える店舗&オフィスのセキュリティ対策術

再帰的関数定義とsin(x)のマクローリン展開の初めの10項を用いてsin(x)の近似値を出力するプログラムを作成せよ。
という問題で、マクローリン展開は分るのですがプログラムに出来ません…。
関数まで習っていて、配列などはまだ習っていないのですが、
どうやれば良いのかどなたか教えてください_| ̄|○

A 回答 (5件)

あくまで一例です。

XXXXの部分が再帰呼び出しをする箇所です。
考えてみて下さい。

/* 第n項まで展開して sin(x) を求める */
dboule sin(double x, int n) {
  
  if ( n == 1 ) {
    return x;
  if (n%2 == 1) {
    return XXXX;
  } else {
    /* n%2 == 0 */
    return XXXX;
  }

}

この回答への補足

最後のXXXXは0ですよね?
最初のXXXXは、
(pow(x,n)/(n * sin(n-1)))
ですか??
n=1から、4項おきに-になると思うんですが、それがうまく表現できません(>_<)

補足日時:2006/05/27 13:00
    • good
    • 1

残念ですが、2つとも不正解ですね。


main関数の最後が、、
printf("sin_10=%10.9f\n", sin(x,10));
だとしたら、これでは正しい答えは出力されませんよね?

この sin 関数はそういう使い方を想定しています。
    • good
    • 0
この回答へのお礼

1つですることはどうしても出来なかったので、2つにしてみました!

double f(int n, int i, double x)
{
if (n<=1){
return (1);}
else{
return (1 - x * x / i / (i+1) * f(n-1, i+2, x));}
}
double sinx(int n, double x)
{
return f(n, 2, x) * x;
}

printf("sin_10=%10.9f\n", sin(x,10));

printf("sin_10=%10.9f\n", sin(n,x));
ですねっ(>_<)

ありがとうございました!!

お礼日時:2006/05/28 12:25

再帰呼び出し、マクローリン展開以前に・・・


提示されたプログラムにはおかしなところがたくさんあります。
コンパイル通ったのでしょうか?
1.main 内の変数 i が初期化されていません。
2.main 内の変数 n を初期化されていますが、以後使われていません。
3.main 内からsin関数を呼び出していますが、この結果が使われていません。
4.sin関数の中からsin関数を呼び出していますが、引数の数が不一致です。

ただわからない、わからない、といわれてもどのへんがどうのようにわからないのか説明しないと、他の方も答えられないと思いますよ。

この回答への補足

#include<stdio.h>
main()
{
int i,n;
double xb,x,sinx=0,hu;

xb=1.0;
hu=1.0;
n=10;

printf("x(rad)=");scanf("%lf",&x);
for(i=1;i<n;i++){
xb=xb*(x/i);
if(i%2!=0){
sinx=sinx+(hu*xb); hu=hu*(-1.0);
}}
if(i%2==0){
printf("sin_10=%10.9f\n",sinx); }
return 0;
}

失礼しました(>_<)
これが、再帰を使わない表現ですよね?
『階乗』を求めるようなものを再帰で表現するのは理解できるのですが、
上のようなものはどこをどう再帰にすれば良いのか良く分からないんです。。

補足日時:2006/05/27 01:50
    • good
    • 0

http://okwave.jp/kotaeru.php3?qid=1629031
とか
http://okwave.jp/kotaeru.php3?qid=1035726
あたりが参考になるんじゃないでしょうか

この回答への補足

ありがとうございます!
しかし、やはり再帰となると良くわかりません。

もう、めちゃくちゃです…

#include<stdio.h>
double sin(double xb, double x, int i);


main()
{
int i,n;
double xb,x,sinx=0,hu;

xb=1.0;
hu=1.0;
n=10;

printf("x(rad)=");scanf("%lf",&x);
sin(xb,x,i)
if(i%2!=0){
sinx=sinx+(hu*xb); hu=hu*(-1.0);
}
if(i%2==0){
printf("sin_10=%10.9f\n",sinx); }
return 0;
}

double sin(double xb, double x, int i)
{
xb=1.0;
return (xb * sin(xb));
}

補足日時:2006/05/27 00:43
    • good
    • 0

宿題なら、自分で解きましょう。


わからなければ、出題者に質問しましょう。

再帰的に解くなら、配列は必要ありません。(そこに再帰的解法の価値がある)

この回答への補足

すみません!!
でも、もう締め切りは過ぎてしまったので(笑)

再帰の説明はもう2度も受けたのですが、まだ理解できないんです。。

補足日時:2006/05/27 00:44
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!