• 締切済み

再帰

x=2のときの4次多項式 f(x) = 1x^4 + 2x^3 + 3x^2 + 4x + 5の解を ホーナー法、再帰を用いて計算せよ という問題(C言語)があるんですけど、よくわかりません。 ホーナー法を用いるということで、そこは自分で調べて (((1x+2)x+3)x+4)x+5となることはわかりました。 でもC言語で書けと言われてもどこをどう再帰で書けばいいのかわかりません。 わかる人だれか教えてください。お願いします。

  • nnnao
  • お礼率28% (4/14)

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

>(((1x+2)x+3)x+4)x+5となることはわかりました。  ・トップの 1 は、(0x+1) の結果として考えると、     ((((0x+1)x+2)x+3)x+4)x+5 となり、 ★プログラム的に《考え易く》なります ← ◆◆◆重要。 (参考URLを下敷きに) #include <stdio.h> int igKeisu[5] = { 1, 2, 3, 4, 5 }; int Horner( int iVal, int iX, int iKou ) {  if( iKou >= 5 ) return( iVal );  iVal *= iX;  iVal += igKeisu[ iKou ];  printf( "%d [%d]\n", iKou, iVal );  iVal = Horner( iVal, iX, ++iKou ); // 再帰呼出  return( iVal ); } void main() {  printf( "%d\n", Horner( 0, 2, 0 ) ); } 注:インデントに全角空白を用いています。   タブに一括変換して下さい。 ------------(コッソリト)------------ >突っ込み受け付けます。 ★中程の } else { は、あってもなくても結果が同じだから、  「ない方」がいいと思います(冗長)。     ・ソースは、   int func( int x, int i )   {     if( i < 3 ) return( x + i );     return( iX * func( x, i - 1 ) + i );   }となろうかと。 ☆だめ押し(教室から男女分けて廊下に出すとき)   ・「女子から廊下に出て」と言った後、「《女子でない》ものも廊下に出て」  の《女子でない》に相当しますよね?。   --- else のキライな年寄りは、---    「女子から廊下に出てね」と言った後は、教室内は男ばっかだから、  「とっとと廊下に出ろ」なんだけど・・。 (予想外のところに「突っ込み」が入って・・) >あってるかなぁ・・・。  結果は同じでした。

参考URL:
http://www.u-aizu.ac.jp/course/alg1/ex/jp/ex04/
  • POTATO_XP
  • ベストアンサー率10% (24/230)
回答No.2

再帰は勘を掴むまで苦労した経験があるので答え書きます。 わかんなかったら状態遷移を書いてみる事です。 あってるかなぁ・・・。(_はインデント) int func(int x,int i){ __if(i<3){ ____return x+i; __} else { ____return x*func(x,i-1)+i; __} } void main(void){ __int x=~; __func(x,5); } 突っ込み受け付けます。参考まで。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

> (((1x+2)x+3)x+4)x+5となる 「何か(1)」にxを掛けて5を加えると、「最終結果」 「何か(2)」にxを掛けて4を加えると、「何か(1)」 「何か(3)」にxを掛けて3を加えると、「何か(2)」 「何か(4)」にxを掛けて2を加えると、「何か(3)」 「何か(4)」は1 上記のロジックを再帰呼び出しで表現します。 関数名は、仮にhornerとでもしますか。 引数は2つ、x(=2)とnum(加える数)でよいでしょう。 horner関数の仕様は下記のとおりです。 numが2以上ならば、一つ前の結果(つまり、horner(x, num-1))にxを掛けてnumを加えた値をreturnします。 numが2以上でなければ、初期値の1をreturnします。 そして、horner関数を呼ぶ側で horner(2, 5) の結果を出力すればOKです。

関連するQ&A

  • JAVAでホーナー法

    こんにちは!! JAVAでホーナー法を書け!!という課題がでました… 多項式はP(x)=x^7+234x^6-1234x^5+176x^4-3456x^3+2345x^2-234x+10047 と与えられています。 これを解くホーナー法を書けということでしょうか?? 繰り返しや、配列を使って書いてみたのはいいのですが… メソッドの部分に多項式の計算を書け!!っていわれて、さっぱり分かりません。returnとか使うみたいですが…全然分かりません。 分かる方は助けて下さい解答お願いします☆☆

  • C言語 再帰呼びだし

    C言語 再帰呼びだし 問題が解けません。もしよろしければご指導お願いします。 フィボナッチ数を求めるプログラミングを作成せよ。 非負の整数nに対するフィボナッチ数Fnは以下のように再帰的に定義される。 Fn=0 (n=0の時) Fn=1 (n=1の時) Fn=F(n-1)+F(n-2) (n>1の時) ・関数int fibo(int n)を作成し、関数mainで、複数のnに対して関数fiboを呼びだし、その結果を表示せよ。 ・関数fiboは、再帰的にfiboを呼びだすようにせよ。 よろしくお願いします。

  • C++でforや再帰関数を使わずに、総当りする方法はありますか?

    C++等で、forを使わず、再帰関数を使わずに多量のループで総当りする方法はありますでしょうか? 自己末尾再帰関数というのがネットで出てきますが、C言語系では使えないみたいです。 再帰関数で変数を全てスタティックにしても、関数の多重呼び出しで容量を食ってプログラムが動かないほどの計算をこなす必要があるのですが、こういった多数の桁のやり方になれておらず、先が見えません… また、全部をforにするのも、桁が大きすぎて問題があります。 どなたかご教授くださいますと幸いです。

  • 射影平面の曲線(射影幾何学?)

    射影平面Pにおいてその上の曲線Cの定義とは、同次多項式F(x,y,z)を用いてF(x,y,z)=0の解集合ですが、確かに同次多項式ならば(x,y,z)がその解ならば任意のt≠0について同次座標(tx,ty,tz)も解になります。 しかし非同次多項式fで、解のどの同次座標もf=0の解になるようなものは本当にないのでしょうか? つまり言い換えると(非同次多項式)=0なる方程式の解集合は射影平面の曲線になり得ないのでしょうか?

  • 再帰的な関数の作り方

    C言語の勉強をしている初心者です。 まだまだ始めたばかりでよく分かっていない状態です。 再帰的な関数が便利そうな事が書かれているのをよく目にしますが、何が便利でどう作ればいいのか分かりません。 分かりやすく教えていただけませんか。

  • 再帰関数のインライン展開

    再帰関数のインライン展開は出来るのでしょうか? もし、出来るようならアセンブラではどのように表現されているんですか? C以外の言語でも、再帰関数のインライン展開が出来るプログラム言語があれば教えてください。

  • 再帰呼び出しの計算量

    再帰呼び出しを用いた関数の計算量を求める方法がわからないので質問させていただきます. xのn乗を再帰呼び出しを用いて求める関数に関して,計算量を求める問題なのですが,どのような方針で求めればよいのでしょうか? int exponent(int x, int n) {   if(n == 0){     return 1;   }else{     return x * exponent(x, n-1);   } } exponentがn回呼ばれるからO(n)というのは間違いでしょうか?

  • ニュートン法をC言語でプログラム

    方程式 cos^2x-0.5=0 (0<x<π) の解をニュートン法で求める という問題をC言語のプログラムを作り計算したいのですが分かりません。 自分で考えてみたプログラムは以下の通りです。 #include <stdio.h> #include <math.h> #define f1(x) cos(x)*cos(x)-0.5 #define f2(x) sin(2*x) /* ニュートン法による方程式の解 */ main() { double x0,x1,a,b,c,d,g,n; a=1; x0=0.7; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解 x= %f \n", a,x1); x0=x1; } } 自分としてはこれが精一杯で、何故間違ってるのか、何をどうすればいいのか、さっぱり分かりません。どういったところが間違ってるのか可能性だけでも示して頂ければ幸いです。 参考として、ニュートン法によるプログラム例として書かれていたものを上げさせて頂きます。 例: e^x-3=0 の解をニュートン法により計算する。 #include <stdio.h> #include <math.h> #define f1(x) exp(x)-3 #define f2(x) exp(x) /* ニュートン法による方程式の解 */ main() { double x0,x1,e,a,b,c,d,g,n; a=1; x0=3; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解  x= %f \n", a,x1); x0=x1; } }

  • C言語 再帰処理のメリットとデメリット

    最近、C言語の関数にも再帰定義ができるということを初めて知りました。 そこで聞きたいのですが、再帰処理のメリット・デメリットは何でしょうか? 思いついたものとしては メリット … 簡単に表記できる デメリット … 無限ループが発生する可能性あり でしょうか。 また、全計算が終わるまでに、途中の演算結果を保持しなければならないので、 メモリを無駄遣いしそうな気もします。

  • 4階の微分方程式の解き方を教えてください!

    問題で与えられる微分方程式は画像として添付しました。 (1) f(x)=0 のとき、この微分方程式の一般解 (2) f(x)=sinx のとき、この微分方程式の一般解 それぞれの求め方を教えていただけませんか? 自分で計算した結果 (1)y=(C1x+C2)cos2x+(C1x+C2)sin2x (A,Bは任意定数)となりました。 間違っているでしょうか?詳しい一般解の導き方を教えてください (2)特殊解をどのようにおけばいいのか分かりません  おき方と解法を教えていただきたいです

専門家に質問してみよう