この問題を解くには?どなたか答えを教えてください!!


工藤ゆー子  2004-12-19 05:26:39  No: 12365

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で記述せよ。


大豆Z  2004-12-19 06:01:27  No: 12366

再帰をもちいないものとは、数学の教科書だして公式かけばいいだけでは?
再帰ってのは、for とはwhile使って繰り返し 足し算したらどう。
答えは自分で出さないとね。
他力本願ってのは、よくないよ。


のらねこ  2004-12-19 08:47:02  No: 12367

http://lecture.ecc.u-tokyo.ac.jp/~csachiko/recursion.html


Del-phi  2004-12-19 11:28:12  No: 12368

質問ですが
≥1
この書き方って一般的なんですか?
n=1から8805までとういう意味でいいのでしょうか?
初めて見たもんでどんなところで使われてる書き方なのか気になります。


もじばけ  2004-12-19 21:09:05  No: 12369

>質問ですが
>≥1
>この書き方って一般的なんですか?
>n=1から8805までという意味でいいのでしょうか?

「一般的」なんてことはないですね(^^ゞ
n(≥1)
というのは、
n(≧1)
と書きたかったんでしょうね。
※ブラウザでは ≥ は、≧と表示されるはずなんですけど、この掲示板では そうならないようで…


Del-phi  2004-12-19 23:36:52  No: 12370

ありがとうございました。
見たこと無い表現だったので凄く気になってました。
でも、1〜8805まで解けだったら誰も解けませんしね^^;


解答用紙  2004-12-20 00:38:36  No: 12371

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;


解答用紙  2004-12-20 00:40:58  No: 12372

正数ならそのまま
整数なら word, Longword → integer;


解答用紙  2004-12-20 00:44:58  No: 12373

a は n=33まで  34以上は範囲を超えるから  0になります
bもn=35以上にすると  戻りが遅い。  n= どこで 0で死ぬかは不明


工藤ゆー子  2004-12-20 09:40:23  No: 12374

皆さん本当にありがとうございます!最後にひとつお願いがあるのですが、この解答用紙さんの答えはどっからどこまでが一個の問いなのか教えていただけないでしょうか?お手数かけます(><)


解答用紙  2004-12-20 10:22:33  No: 12375

>この解答用紙さんの答えはどっからどこまでが一個の問いなのか
>教えていただけないでしょうか?お手数かけます(><)
や、やっぱり超初心者さんでしたか・・・
分かりやすいように、上から順番に4つ並べています。
区別が付くようにコメントもいれてますが(^_^;)
//の後は、その行の後ろの文字はコメントなのでプログラムとは関係ありません

・n(&#8805;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;
---------------------------------------------------

解決したら  解決マーク押してね
>←解決時は質問者本人がここをチェックしてください。


ウォレス  2004-12-20 21:45:08  No: 12376

質問に対する答えや回答者の方々の意図からは外れてしまいますが・・・
問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;

こんな感じでスグ表示できますよね^^


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加