program recursion_sample(input, output); var n : real; function factrial(n :real): real; begin if n=1.0 then begin factrial := 1.0; end else begin factrial := n*factrial(n-1); end; end; begin write('Enter n : '); readln(n); writeln('N = ', n:5, ' N! = ', factrial(n):20); end.上の例 は、階乗を計算するプログラムである。階乗は、下のように定義される:
Pascal のようなプログラミング言語では、この定義に従って素直にプログ
ラムを書くことができる。上の例では、まさに、
factrial(5) →5*factrial(4) →5*(4*factrial(3)) →5*(4*(3*factrial(2))) →5*(4*(3*(2*factrial(1)))) →5*(4*(3*(2*1))) →5*(4*(3*2)) →5*(4*6) →5*24 →120
program tree_display(input, output); #include <xgraph.h> var gdriver, gmode : integer; x,y,vx,vy : real; i,j : integer; procedure tree(n, x, y: integer; angle, length : real); var x1, y1 : integer; begin if n > 0 then begin setcolor( n mod 7 + 1); x1 := round(x + length*cos(angle)); y1 := round(y - length*sin(angle)); line(x,y,x1,y1); tree(n-1,x1,y1,angle + 0.25, length*0.7); tree(n-1,x1,y1,angle - 0.25, length*0.7); end; end; begin initgraph(gdriver, gmode, ''); cleardevice; clrscr; tree(10, getmaxx div 2, getmaxy, pi/2, getmaxy div 4); readln; closegraph; end.これは、樹形図を書くプログラムである。原理は、指定した長さと角度で一本 線を引き、その先から角度をつけて2本線を引き、それぞれの端からまた角度 をつけて、、、というのを繰り返すだけである。
再帰を使うことで、角度、長さを変えて自分自身を呼び出すという形で簡潔に アルゴリズムが表現できている。
program newton_raphson(input, output); var x, f, df: real; begin x := 1.0; repeat f := cos(x) - x; df:= -sin(x) - 1.0; x := x - f/df; writeln('x=', x:20:16, ', cos(x)-x=', f); until abs(f) < 1e-10; end.ニュートン法では、近似解のところで関数の接線をひき、それと軸との 交点を新しい近似解にする。 y=f(x)の x=x0での接線の方程式は y=f(x_0)+f'(x0)(x-x0)$なので、x軸との交点は x = x0 -f(x0)/f'(x0) になるわけである。
x= 0.7503638678402439, cos(x)-x=-4.59697694131860e-01 x= 0.7391128909113617, cos(x)-x=-1.89230738221174e-02 x= 0.7390851333852840, cos(x)-x=-4.64558989907715e-05 x= 0.7390851332151607, cos(x)-x=-2.84720580445708e-10 x= 0.7390851332151607, cos(x)-x= 0.00000000000000e+00
これは、以下のようなプログラムで実現できる。
program direct_iteration(input, output); var x, xold: real; begin x := 1.0; repeat xold := x; x := cos(x) ; writeln('x=', xold:20:16, ', x-cos(x)=',xold-x:20:16 ); until abs(x-xold) < 1e-10; end.
しかし、連立一次方程式を解くこと自体それほど簡単ではないし、また、
すべての偏導関数を計算するプログラムを作るのも結構厄介である。
これに対し、直接代入法では、ほとんど何も考えなくてもプログラムが 作れる。もちろん、答が求まるための条件がつくが、様々な実用上の問 題で結構うまく求めることができる。
cc76821@komaba.ecc.u-tokyo.ac.jpあてに、 Subject を kadai-3 として提出すること。グラフィックスの出力結 果を提出する場合には、xvを使って gif ファイルにし、ファイル名(サブディレクトリに置いた場合はそのディレクトリ名もつけて)をレポート中に書くこと。 可能であれば、レポート自体を HTML 形式で書き、文書の中に図へのリンクを埋め込むのでも構わない。 なお、今回のレポートは、適当な時期に WWW 上で公開するかもしれないので、公開さ れても構わないような内容にして下さい。締切は、9/4とする。