• 締切済み

再帰呼出しによる自然対数を求めるプログラム

題名そのままです。再帰によって階乗を求めるプログラムは書けたのですが、自然対数になると値をプラスしていくところでこんがらがってしまいます。助けてくださいお願いします。

  • i00323
  • お礼率70% (188/265)

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>自然対数の底 なるほど、 とりあえずサンプルとなるようなプログラムを呈示するのは、(実用になるかはともかく^^;)簡単ですが、質問の大意は、再帰を使った和の求め方だったと思うので、#1が参考になるかとと思います。 e=1+1/1!+1/2!+1/3!…1/n! で、能率を考えなければ n!=fact(n)で既に求めることができるのだから e=1+Σ[k=1からnまでの和]1/fact(n) f(n)=1/1!+1/2!+1/3!…1/n! ですが、とりあえず、f(n)という関数が定義できたとすると、 f(n)=f(n-1)+1/n! というのがわかると思います。 要するにn-1番目までの和が既に求まっていれば、 n番目までの和は n-1番目までの和+n番目の数になります。 要するに、このf(n-1)の部分が再帰呼び出しということになります。 f(n-1)は、 f(n-1)=f((n-1)-1)+ 1/(n-1)!で f(n-1-1-1…)となっていきますが、 n=1でこれ以上前には戻れなくなるので、値が1に決定し、逆に(後ろに戻って)全体の値が決定することになります。 なので、再帰的な関数では、まず終了条件によって値が確定し返すことを書いてから、終了しないときは、再帰的に(問題を小さくして)呼び出します。 つまり、 double f(int n){ if(n==0)return 0; return 1.0/fact(n)+f(n-1); } のような形になります。 この場合 e=1+f(n); 実際には、計算の精度や能率を考慮しないといけません。

  • ency
  • ベストアンサー率39% (93/238)
回答No.3

答え書いてしまうのも、どうかと思いますので、とりあえず、私の場合の考え方だけ。 ------------------------------------------------ n=0: f(0) = 1 n=1: f(1) = 1 + 1/1! = f(0) + 1/1! n=2: f(2) = 1 + 1/1! + 1/2! = f(1) + 1/2! n=3: f(3) = 1 + 1/1! + 1/2! + 1/3! = f(2) + 1/3! …… よって、次のように書けそうだ。 n>=1 の場合 f(n) = f(n-1) + 1/n! n=0 の場合 f(0) = 1 ------------------------------------------------ あとは、これは再帰の形でプログラムしてみれば良いと思います。 # はずしていたら、ごめんなさい。。。 # n! の部分は、作成済みの階乗の関数を流用すれば良いと思います。 ## ここまでいったら、ほぼ回答してしまっているのと同じかもしれませんね。 まずは、こんな感じでいかがでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

{(x-1)/(x+1)}の2乗を掛けていく方がいいかも?

i00323
質問者

お礼

すいません!自然対数ではなく「自然対数の底」でした!申し訳ありません。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

math.h log() を使いましょうって 再帰にする理由がよくわからないのですが、 多分級数表現をプログラムするということなのでしょうが、どういう式を、どういうふうにプログラムしようとしているのですか? まあ、こんな感じかな? #include <stdio.h> #include <math.h> double add(double x, int k){ int n=2*k-1; if(k==0)return(0.0); return(pow((x-1)/(x+1), n)/n + add(x, k-1)); } void main(){ double x=5.0; x=add(x,20)*2.0; printf("f(5.0)≒%f\n",x); }

i00323
質問者

お礼

ありがとうございます!! 式はe=1+1/1!+1/2!+1/3!…1/n! という式です! 自分でnの値は自分でscanfして入力します。 BLUEPIXYさんの式でやってみたところ、17あたりで自然対数の値が2.71828182845・・・を超えてしまいます。自分のやり方が違っていたらすみません。

関連するQ&A

  • 再帰呼び出しを使いますか?

    趣味でプログラムをかじる程度なのですが、今まで自分はプログラムを作っていて再帰呼び出しを使ったことがありませんが、みなさんは良く使うのでしょうか? なかなか再帰呼び出しを考えるのが難しく自分のプログラムで適用すると良いところなど思い浮かびません。 再帰呼び出しをすると何か利点とかあるのでしょうか? 再帰呼び出しで無いと作るのが難しいプログラムなど今までありましたか?あればどんな処理だったかなど教えてください。

  • 再帰処理を用いて階乗を求めるプログラム

    こんにちは 再帰処理を用いて階乗を求めるプログラムについて の質問です。 以下のように考えたのですが、 まったく駄目なようです。 どこをどのように直したらいいのか いまいちわかりません。 どなたか教えて下さい。お願いします。 Private Sub CommandButton1_Click() Dim n As Integer 階乗する数 Dim f As Integer 階乗する数の階乗した値 n = Val(TextBox1)   Do While f > 1 KEISAN n, f Loop TextBox2 = f End Function Function KEISAN(n, f) If n <= 1 Then f = 1 Else f = n * f(n - 1) End If End Function

  • 自然対数

    はじめまして、よろしくお願いします プログラミングに頻繁に出てくる自然対数について調べていたのですが、調べてみてもeやら何やらの底だの出てきて中学生の私には何がなんだかさっぱりです(汗 そこで質問なのですがこの自然対数というのはどのような時に使うのかを簡単に説明していただきたいです。 また自然対数についてわかりやすく解説しているサイトがあれば教えてください。 なんどか自然対数について質問すると思いますがよろしくお願いします

  • 再帰呼び出し

    C++のクラスで n!=n(n-1)(n-2)...1 n!を求めるprogramを作らなくてはならないのですが 再帰を使わずに、関数factorial(n)を使わないといけません。 ちんぷんかんぷんです。 for(counterとcounter--を使った)物しか思いうかびません。 関数factorial(n)を使うというのはnに戻るつまり再帰というふうには ならないのですか? 関数と再帰の意味を漠然としかわかっていないのですが。 よろしくお願いします。

  • 自然対数をとる?とは・・・

    y=x^x 両辺の自然対数をとると logy=xlogx これはどういうことなのかさっぱりです。 ログについては、たとえばlog(小さい2)8 なら2を何乗かしたら8になります ってことは2を3乗すると8だから log(低?が2)8の答えは3だ!  ということなどは分かるのですが、一番上の式の意味と自然対数をとるという意味が分かりません。 「自然対数」とか「常用対数」とか言葉はしっているのですが、内容がいまいち分からなくて・・・ お願いします!!!

  • 自然対数はどこら辺が「自然」なの?

    教えてください。 そもそも自然対数という名が与えられた理由は何なのでしょうか? 微分積分を考えていると「自然」にでてくるから? 数学の問題をいろいろと考えているときにさまざまなところに出てきて「自然」だから? それとも私たちの身の回りの「自然界」にこの対数に従うものが多々あるから? どうなのでしょうか? どこかで、「自然界」でよく現れるから自然対数というのだ、という説明を見たような記憶があるのですが、それならば、自然界でよく現れているそのたくさんの実例とは何なのでしょうか? その説明を見たときには確か示されていなかったように思います。 指数関数や2を底とした対数関数などは菌の増殖などかな、とは思いますが、自然対数となると思い浮かびません。 実例があるのならば何なのでしょうか?教えてください。 以上、 自然対数と名付けられた理由 どこが自然なのか 自然界に現れるならどんな実例があるのか などについて、何か知っていましたら回答よろしくお願いします。 加えて、出典や参考文献、参考サイトなどがありましたらぜひ教えていただければと思います。 回答、お待ちしております。

  • プログラム構造の「再帰的」について

    再帰的の説明に 「再帰的とは、あるプログラムがその内部から自分自身を呼び出して使用できる性質である。」「したがって再帰的であれば、必然的に再入可能でもある。」とありました。 ここで、「したがって再帰的であれば、必然的に再入可能でもある。」とは、つまり、プログラムAの中に再帰したプログラムA’が既に再入している状態にある、ということを表しているという理解かな?と思っているのですが、宜しいのでしょうか? より良い理解のために、補足説明などいただけたら、と思います。よろしくお願いいたします。

  • c言語の再帰で(関数呼び出し)+1がわからない

    再帰がどのように処理されているのか理解するために、再帰の時に +1 してみたところ 0! = 1 1! = 2 2! = 5 3! = 16 4! = 65 5! = 326 6! = 1957 7! = 13700 8! = 109601 9! = 986410 10! = 9864101 となりました。 普通の階乗の値を求めた最後に +1され、それが戻されると思ったのですが違いました。 これはどういう処理がされているのでしょうか? #include <stdio.h> int kaijo(int); int main() { int i; for (i = 0; i < 11; i++) printf("%d! = %d\n", i, kaijo(i)); return 0; } int kaijo(int n) { if (n == 0) return 1; else return n * kaijo(n - 1) + 1; }

  • 自然対数

    自然対数lnはどのような時に使うんですか? どんな計算に便利??

  • 自然対数で使用するeの値

    自然対数で使用するeの値が2.718になることを級数を用いて証明したいのですが、よくわかりません。 どなたかよろしくお願いします。