a(n)=1×2×...×n
b(n)=b(n-1)+b(n-2)、 b(1)=1、 b(0)=0
・n(≥1)が入力として与えられたとき、a(n)の値を返す再帰的なプログラムを記述せよ。
・上記の問題を再帰を用いないプログラムで記述せよ。
・n(≥1)が入力として与えられたとき、b(n)の値を返す再帰的なプログラムを記述せよ。
・上記の問題を再帰を用いないプログラムで記述せよ。
※ただし入力と出力は全ての整数型で与えられるとし、記述はDel-phiで記述せよ。
再帰をもちいないものとは、数学の教科書だして公式かけばいいだけでは?
再帰ってのは、for とはwhile使って繰り返し 足し算したらどう。
答えは自分で出さないとね。
他力本願ってのは、よくないよ。
http://lecture.ecc.u-tokyo.ac.jp/~csachiko/recursion.html
質問ですが
≥1
この書き方って一般的なんですか?
n=1から8805までとういう意味でいいのでしょうか?
初めて見たもんでどんなところで使われてる書き方なのか気になります。
>質問ですが
>≥1
>この書き方って一般的なんですか?
>n=1から8805までという意味でいいのでしょうか?
「一般的」なんてことはないですね(^^ゞ
n(≥1)
というのは、
n(≧1)
と書きたかったんでしょうね。
※ブラウザでは ≥ は、≧と表示されるはずなんですけど、この掲示板では そうならないようで…
ありがとうございました。
見たこと無い表現だったので凄く気になってました。
でも、1〜8805まで解けだったら誰も解けませんしね^^;
function a(n:word): Longword;
// a(n)=1×2×...×n 、n(≧1)
// 再帰を用いる
begin
if (n<=1) then Result := n
else Result := n * a(n-1)
end;
function a2(n:word): Longword;
// a(n)=1×2×...×n 、n(≧1)
// 再帰を用いない
var a , i :Cardinal;
begin
a := 1;
if (n>1) then for i := 2 to n do a := a * i;
Result := a
end;
function b(n:word): Longword;
// b(n)=b(n-1)+b(n-2)、 b(1)=1、 b(0)=0、n(≧1)
// 再帰を用いる
begin
if (n<=1) then Result := n
else Result := b(n-1) + b(n-2)
end;
function b2(n:word): Longword;
// b(n)=b(n-1)+b(n-2)、 b(1)=1、 b(0)=0、n(≧1)
// 再帰を用いない
var b, b_1,b_2 , i : Longword;
begin
b_1 := 1; b_2 := 0; b := 1;
if (n>1) then
for i := 2 to n do
begin
b := b_1 +b_2;
b_2 := b_1;
b_1 := b;
end;
Result := b
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := 'a('+Edit1.Text+') = ' +
IntToStr(a(StrToInt(Edit1.Text)));
Edit3.Text := 'a2('+Edit1.Text+') = ' +
IntToStr(a(StrToInt(Edit1.Text)))
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Text := 'b('+Edit1.Text+') = ' +
IntToStr(b(StrToInt(Edit1.Text)));
Edit3.Text := 'b2('+Edit1.Text+') = ' +
IntToStr(b(StrToInt(Edit1.Text)))
end;
正数ならそのまま
整数なら word, Longword → integer;
a は n=33まで 34以上は範囲を超えるから 0になります
bもn=35以上にすると 戻りが遅い。 n= どこで 0で死ぬかは不明
皆さん本当にありがとうございます!最後にひとつお願いがあるのですが、この解答用紙さんの答えはどっからどこまでが一個の問いなのか教えていただけないでしょうか?お手数かけます(><)
>この解答用紙さんの答えはどっからどこまでが一個の問いなのか
>教えていただけないでしょうか?お手数かけます(><)
や、やっぱり超初心者さんでしたか・・・
分かりやすいように、上から順番に4つ並べています。
区別が付くようにコメントもいれてますが(^_^;)
//の後は、その行の後ろの文字はコメントなのでプログラムとは関係ありません
・n(≥1)が入力として与えられたとき、a(n)の値を返す再帰的なプログラムを記述せよ。
function a(n:word): Longword;
begin
if (n<=1) then Result := n else Result := n * a(n-1)
end;
です
・上記の問題を再帰を用いないプログラムで記述せよ。
function a2(n:word): Longword;
var a , i :Longword;
begin
a := 1;
if (n>1) then for i := 2 to n do a := a * i;
Result := a
end;
ほかも同じです。
function 〜
begin
〜
end;
が一個だと思ってください
変数と、関数(function)、 手続き(procedure)
のところを、とりあえず がんばって覚えましょうね。
次からは自分でがんばってね。
---------------------------------------------------
下は動作出力確認用のためのものです。
問題とは直接確認ありません。
a2,b2の所をaとなっていたので訂正版は下
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := 'a('+Edit1.Text+') = ' +
IntToStr(a(StrToInt(Edit1.Text)));
Edit3.Text := 'a2('+Edit1.Text+') = ' +
IntToStr(a2(StrToInt(Edit1.Text)))
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Text := 'b('+Edit1.Text+') = ' +
IntToStr(b(StrToInt(Edit1.Text)));
Edit3.Text := 'b2('+Edit1.Text+') = ' +
IntToStr(b2(StrToInt(Edit1.Text)))
end;
---------------------------------------------------
解決したら 解決マーク押してね
>←解決時は質問者本人がここをチェックしてください。
質問に対する答えや回答者の方々の意図からは外れてしまいますが・・・
問2はフィボナッチ数列ですね。(よく見る定義とは1ずれていますが)
フィボナッチ数列を表示するには、
procedure TForm1.Button1Click(Sender: TObject);
var
n :Integer;
F,a,b :Double;
begin
a := (1+Power(5,0.5))/2;
b := (1-Power(5,0.5))/2;
for n := 0 to 38 do
begin
F := 1/(Power(5,0.5)) *( Power(a,n) -Power(b,n));
Memo1.Lines.Add(Format('n=%d F(n)=%d', [n,round(F)]));
end;
end;
こんな感じでスグ表示できますよね^^
ツイート | ![]() |