計算機プログラムの構造と解釈(SICP)学習メモ
蒋 いつ峰 2008/07/06   |  プログラミング基礎
第一章 練習1.15 正弦関数を求める 2008/07/06  |  PK:SICP 練習 1.15

問題規模が大きくなる時、コストの増加は線形、指数、対数などの形となります。


問題

SICPの練習 1.15 です。x は十分に小さい時、sin(x) = x は近似成立。また、sin(x) = 3 * sin(x / 3) - 4 * sin(x / 3)3 は常に成り立ちます。上記ルールに基づいて sin(a) を求めて下さい。また、その時の空間と時間コストは何でしょう?


解答

 
  1. /** 
  2.  * sin(x) の計算 
  3.  */  
  4.   
  5. import std.stdio;  
  6. import std.math;  
  7.   
  8. int loop;  
  9. float SMALL_ENOUGH = 0.1;  
  10.   
  11. float sine(float x) {  
  12.     if (abs(x) <= SMALL_ENOUGH) {  
  13.         return x;  
  14.     }  
  15.     return p(sine(x / 3.0));  
  16. }  
  17.   
  18. float cube(float x) {  
  19.     return x * x * x;  
  20. }  
  21.   
  22. float p(float x) {  
  23.     loop++;  
  24.     return 3 * x - 4 * cube(x);  
  25. }  
  26.   
  27. void main() {  
  28.     loop = 0;  
  29.     float x = 1.215;  
  30.     float ret = sine(x);  
  31.     writefln("sine(%f) = %f, loop = %d", x, ret, loop);  
  32.   
  33.     loop = 0;  
  34.     x = 12.15;  
  35.     ret = sine(x);  
  36.     writefln("sine(%f) = %f, loop = %d", x, ret, loop);  
  37.   
  38.     loop = 0;  
  39.     x = 121.5;  
  40.     ret = sine(x);  
  41.     writefln("sine(%f) = %f, loop = %d", x, ret, loop);  
  42.   
  43.     loop = 0;  
  44.     x = 1215;  
  45.     ret = sine(x);  
  46.     writefln("sine(%f) = %f, loop = %d", x, ret, loop);  
  47.   
  48.     loop = 0;  
  49.     x = 12150;  
  50.     ret = sine(x);  
  51.     writefln("sine(%f) = %f, loop = %d", x, ret, loop);  
  52.   
  53.     loop = 0;  
  54.     x = 121500;  
  55.     ret = sine(x);  
  56.     writefln("sine(%f) = %f, loop = %d", x, ret, loop);  
  57. }  

実行結果:

uprush@uprush-dev:~/src/d/sicp$ ./q1_15
sine(1.215000) = 0.937512, loop = 3
sine(12.150000) = -0.399804, loop = 5
sine(121.500000) = 0.818955, loop = 7
sine(1215.000000) = 0.023834, loop = 9
sine(12150.000000) = 0.999932, loop = 11
sine(121500.000000) = 0.539522, loop = 13


空間コストは O(1) でしょう。時間コストは log3(a) でしょう。


閲覧  |  コメント  |  目次

 
ヘルプ  |  ご利用規約  |  相互リンク  |  問合せ
リンクはご自由に、問合せはお気軽に
©2007 Uprush