皆さんの回答が、ヒントだけ差し上げようというご配慮からだと思いますが、細切れになっちゃったみたいなので、僭越ながら。
Pascalにしちゃ、セミコロンが抜けてたりピリオドが無かったりしますけど、まいいか。
Assertionという考え方を使います。Assertionってのは「文と文の間で成り立っている論理式」のことです。
{nは自然数}
s:=0;
i:=1;
j:=1;
{s=0, i=1, j=1, nは自然数}
while i <=n do
{i≦n, nは自然数}
begin
s:=s+j*i
i:=i+1;
j:=j*(-1)
end
{i>n, nは自然数}
まずここまでは自明でしょう。
次にループの中では invariant assertion、つまり繰り返し中いつでも成り立つ論理式を考える。ここで、
i:=i+1;
のような代入は、繰り返しの回数を数えるカウンターmを追加して
i(m):=i(m-1)+1;
という意味だと解釈してやります。すると
s:=0;
i:=1;
j:=1;
m:=0;
{s(0)=0, i(0)=1, j(0)=1, m=0,nは自然数}
while i <=n do
{i(m)≦n,nは自然数}
begin
m:=m+1
s:=s+j*i
i:=i+1;
j:=j*(-1)
{nは自然数, s(m)=s(m-1)+j(m-1)*i(m-1), i(m)=i(m-1)+1, j(m)=-j(m-1)}
end
さて、
i(0)=1, i(m)=i(m-1)+1
より
i(m) = m+1
であることが分かります。
それから
j(m) = (-1)^m
も自明ですね。従って
{s(0)=0, i(0)=1, j(0)=1, m=0,nは自然数}
while i <=n do
{i(m)≦n,nは自然数}
begin
m:=m+1
s:=s+j*i
i:=i+1;
j:=j*(-1)
{nは自然数, s(m)=s(m-1)+((-1)^(m-1))*m, i(m)=m+1, j(m)= (-1)^m}
end
いよいよミソの部分ですが、
s(0)=0
s(m)=s(m-1)+((-1)^(m-1))*m
という漸化式ですから、
s(m)= Σ((-1)^(k-1))*k (Σはk=1,2,....,m)
です。だから、
{s(0)=0, i(0)=1, j(0)=1, m=0,nは自然数}
while i <=n do
{i(m)≦n,nは自然数}
begin
m:=m+1
s:=s+j*i
i:=i+1;
j:=j*(-1)
{nは自然数,s(m)= Σ((-1)^(k-1))*k (Σはk=1,2,....,m), i(m)=m+1, j(m)=(-1)^m}
end
そしてループを抜けた時には
i(m)>n
が初めて成り立った訳です。そしてnは自然数なので、m=n だと分かります。ゆえに、
end
{s(n)= Σ((-1)^(k-1))*k (Σはk=1,2,....,n), i(n)=n+1, j(n)=(-1)^n),}
writeln('n=' ,n:3,' のときs=',s:5)
ということ。で、writelnで使うのはnとsだけですんで、i,jはどうでも良い。かくて
nと、Σ((-1)^(k-1))*k(Σはk=1,2,....,n) が印刷されることになる。
さて次に、s(n)は
s(n)=Σ((-1)^(k-1))*k(Σはk=1,2,....,n)=1-2+3-4+......n
という和です。2項づつ組にしてみると
●nが偶数の時
s(n) = (1-2)+(3-4)+....+((n-1)-n) = (-1)+(-1)+....+(-1) = -(n/2)
●nが奇数の時
s(n) = 1+(-2+3)+(-4+5)+.....+(-(n-1)+n) = 1+1+....+1 = (n+1)/2
だから、
nが偶数ならs(n) = -(n/2)
nが奇数ならs(n) = (n+1)/2
このs(n)が印刷されるということ。
お礼
非常に細かく、ありがとうございました。 とても参考になりました。