• 締切済み

大学数学(情報系?)の計算アルゴリズムの質問です

疑似コードの問題で考え方がよくわかりません。得意な方、考え方を教えてください。 (1) n=4として、a1=2,a2=1,a3=5,a4=1が与えられたとき、 (a1,a2,a3,a4の数字は下付) 以下の疑似コードを実行する。 for i=1,2,…,n-1 do if ai>ai+1 then t←ai+1 ai+1←ai ai←t end if end for (aiのi,ai+1のai+1は下付です) 実行後のa1,a2,a3,a4を求めなさい。(a1,a2,a3,a4の数字は下付) 答 (a1,a2,a3,a4)=(1,2,1,5) (2) n=4として、a1=3,a2=1,a3=2,a4=4が与えられたとき、 (a1,a2,a3,a4の数字は下付) 以下の疑似コードを実行する。 for i=1,2,…,n-1 do if ai<ai+1 then t←ai+1 ai+1←ai ai←t end if end for (aiのi,ai+1のai+1は下付です) 実行後のa1,a2,a3,a4を求めなさい。(a1,a2,a3,a4の数字は下付) 答 (a1,a2,a3,a4)=(3,2,4,1)

みんなの回答

  • SI299792
  • ベストアンサー率48% (714/1476)
回答No.2

最初、何がなんだか判りませんでした。全ての文字が同じ大きさになっていて、これでは問題として成立しません。よく見ると下付と書いてありましたが、これではどこからどこまでが下付かわかりにくいです。これにプラス実際の問題を画像でつけるか、又は私がやったように下付に括弧を付けた方がいいです。 まず、このプログラムが何をしているのかを理解すること。 for i=1,2,…,n-1 do 繰り返す回数を指定   if a(i)>a(i+1) then 先の数字が次の数字より大きい場合     t←a(i+1) 次の数字をtに一時保存する     a(i+1)←a(i) 先の数字を次の数にに入れる     a(i)←t 一時保存したtを先の数字に入れる   end if これで先の数字と次の数字が入れ替わる end for つまり、先の数字と次の数字を比較して先の数字が大きければ入れ替えているのです。 次は実際にこの通りに紙と鉛筆でやってみるしかありません。 ロジックを見ると、先の数字と次の数字を比較して先の数字が大きければ入れ替えています。                            2 1 5 1 1回目は2と1を比較して、2が大きいから入れ替える→ 1 2 5 1 2回目は2と5を比較して、5が大きいから何もしない→ 1 2 5 1 3回目は5と1を比較して、2が大きいから入れ替える→ 1 2 1 5 になります。 下の問題は次の数字が小さければ入れ替えています。                            3 1 2 4 1回目は3と1を比較して、1が小さいから何もしない→ 3 1 2 4 2回目は1と2を比較して、1が小さいから入れ替える→ 3 2 1 4 3回目は1と4を比較して、1が小さいから入れ替える→ 3 2 4 1 になります。

atcazbj4
質問者

お礼

よくわかりました。 ありがとうございます。

  • f272
  • ベストアンサー率46% (8011/17123)
回答No.1

考え方なんてなにもない。単なるアルゴリズムなのだから、何も考えずに手順に従って処理するだけです。

関連するQ&A

  • 大学数学の問題です

    勉強不足でわかりません。得意な方、解答お願いいたします。 問1 補間点をX0=1,X1=2,X2=3,とし、これらの補間点での関数値をf0=4, f1=-3, f2=2とする。ラグランジュ補間多項式をP(X)=A(x-2)(x-3)+B(x-1)(x-3)+C(x-1)(x-2)と表したとき、A,B,Cに入る値を求めよ。 問2 関数f(x)=x^3-1に対するニュートン法の式をxk+1=xk-Aとする。Aを書き表せ。※k+1、kは1/4下付文字 問3 n=4としてa1=2、a2=3、a3=-2、a4=5が与えられたとき、以下の疑似コードを実行するとa1,a2,a3,a4はどうなるか。 for i =1,2,…,n-1 do if ai<ai+1 then t ← ai+1 ai+1 ← ai ai+1 ← t end if end for ※疑似コードのi、i+1は1/4下付文字

  • プログラムに内容と計算の質問です。

    こんにちは。 補間多項式についての、コンピュータのプログラムの解読に困っています。内容は、 「For the numerical experiments suggested in the computer problems, the following two procedures should be satisfactory. The first is called Coef. It requires as input the number n and tabular values in the array {Xi} and {Yi}. Remember that the number of points in the table is n+1. The procedure then computes the coefficients required in the Newton interpolating polynomial, storing them in the array{Ai}. -------------------------------------------------------- procedure; Coef(n,{Xi},{Yi},{Ai}) real array; {Xi}0:n, {Yi}0:n, {Ai}0:n integer; i,j,n for i=0 to n do {Ai}←{Yi} end for for j=1 to n do for i=n to j step -1 do Ai←({Ai}-{Ai-1})/({Xi}-{Xi-j}) end for end for end procedure Coef --------------------------------------------------------- このプログラムのn=3の時を考えるとき、  (1)j=1のとき、i=3,2,1 <j=1,i=1> {A1}=({A1}-{A0})/({X1}-{X0}) =({Y1}-{Y0})/({X1}-{X0}) <i=1,i=2> {A2}=({A2}-{A1})/({X2}-{X1}) =({Y2}-{Y1})/({X2}-{X1}) <i=1,i=3> {A3}=({A3}-{A2})/({X3}-{X2}) =({Y3}-{Y2})/({X3}-{X2}) (2)j=2のとき、i=3,2 <j=2,i=1> A1=({A2}-{A1})/({X2}-{X0})          ={[({Y2}-{Y1})/({X2}-{X1})]-[({Y1}-{Y0})/({X1}-{X0})]}/({X2}-{X0}) =この式変形をしたいのですが、どのように         すれば良いのかわかりません。ラグランジェ         型になりそうでなりません(泣)         (1)で求めた{A1},{A2},{A3}を使って求めな         いといけないみたいです。 見にくい表し方で申し訳ありません。 アドバイスお願いします!!

  • このアルゴリズムの解がわかりません。

    入れ子になった正方形を描くアルゴリズムについて勉強しています。 添付の画像のように、「*」を用いて、入れ子構造になった正方形 を描く為のアルゴリズムを疑似言語で作る問題があります。 一番外側の枠を書く条件はわかるのですが、それ以外が考えても考えてもわかりません。 問題には以下のアルゴリズムの穴埋めを行いますが、埋まる内容とその理由を 教えていただけませんでしょうか? ここから --------------------------------------------------------------------------- procedure main: begin     I ← 1;     while I <= L do begin         J ← 1;         while J <= L do begin             if I が奇数である then                 if ***** 穴埋め「ア」 ***** then                     write "*"                 else if ***** 穴埋め「イ」***** then                     write "*"                 else if ***** 穴埋め「ウ」***** then                     write "*"                 else                     write " "             else                 if ***** 穴埋め「エ」***** then                     write " "                 else if ***** 穴埋め「イ」***** then                     write " "                 else if ***** 穴埋め「ウ」***** then                     write " "                 else                     write "*"             J ← J + 1         end;                  改行する;         I ← I + 1     end end --------------------------------------------------------------------------- ここまで 補足ですが、正方形の1辺の文字数は、変数Lに設定されており、その文字数は、この方法で正方形が描ける(7が最少で11、15...のように4つずつ増える)であるものとするみたいです。 どうかヒントだけでも構いませんので、 ご教授よろしくお願いいたします。

  • アルゴリズムについての質問です

    アルゴリズムについての質問です。 以下のようなプログラムを考えています。 プログラムの目的 ある建物で各部屋同士の机の移動を行うため、その労力を最小にする組み合わせを求める。 ※このシステムは他の人が使用することを考え、わかりやすいExcel(VBA)を使用しています。 画像に関して <図1>は「No(部屋)」の距離(数字が小さい方が労力が少ない)を表しています。 ※プログラムでこの表は出力されています <図2>のようにA群とB群があり、A群からB群に移動する(複数移動も含む)場合について考えます。 <図3>のような最小の組み合わせを探します。 正しい結果は出るのですが、1件増えるだけで何倍何十倍と時間がかかってしまいます。 多少結果は妥協して(最小に近い値)でも処理を早くしたいと思っていますが、そのアルゴリズムが思いつきません。 作成したプログラムを下記にありますので、アドバイスをお願いいたします。 作成したプログラムで処理を遅くしている原因があれば指摘もお願いします。 ---現在作成したプログラムです。(すべてのパターンを検証)----------------- Dim 重みtab As Variant Dim t01(100) As Integer '←A群が、「t01(1)」から順に入っています。 Dim t02(100) As Integer '←B群が、「t02(1)」から順に入っています。 Dim ttt(100) As Integer '←B群を並び替えた結果が入ります。 Sub 計算(移動数 As Integer) '「移動数」は「t01」「t02」の要素の数 Dim t03(100) As Integer Dim a As Integer 重みtab = Range("重み表") 'Range("重み表") は <図1>の「No」を含まないセル '仮の最小の計算-------- min = 0 For a = 1 To 移動数 min = min + 重みtab(t01(a), t02(a)) ttt(a) = a Next '---------------------- Call 再帰関数(移動数, t03, 1) 'Sheet2に出力---------- For a = 1 To 移動数 Sheets("Sheet2").Cells(a, 1) = t01(a) Sheets("Sheet2").Cells(a, 2) = t02(ttt(a)) Next '---------------------- End Sub Sub 再帰関数(移動数 As Integer, t03() As Integer, cnt1 As Integer) Dim cnt2 As Integer Dim flg As Boolean For a = 1 To 移動数 flg = True For b = 1 To cnt1 - 1 If t03(b) = a Then flg = False End If Next If flg Then t03(cnt1) = a If cnt1 < 移動数 Then cnt2 = cnt1 cnt1 = cnt1 + 1 Call 再帰関数(移動数, t03, cnt1) cnt1 = cnt2 Else Call 処理(移動数, t03) End If t03(cnt1) = 0 End If Next End Sub Sub 処理(移動数 As Integer, t03() As Integer)  ’最小であるか確認 Dim a As Integer Dim b As Integer For a = 1 To 移動数 b = b + 重みtab(t01(a), t02(t03(a))) Next If min > b Then min = b For a = 1 To 移動数 ttt(a) = t03(a) Next End If End Sub

  • フォートラン(初級?)についての質問です。

    はじめまして。 フォートラン初心者の者です。 y=2^xの式において、DO LOOPを使って yが99桁の数字になるxの最大値を求めたいのですが、どうもうまくいきません。 こんな感じで書いてみました。 ----------------------- Do i=0, 1000 A= 2**i IF (A > (10**10)) then STOP end if end do ----------------------- 独学なので、出来るだけ詳しく教えて頂けると幸いです。

  • オブジェクトが必要???

    Excel VBAで以下のコードを作成しました。 データを比較して、抽出する簡単なモノです。 ですが、いざ実行すると、「実行エラー:424 オブジェクトが必要です」と表示され動きません・・・。 自分なりに調べて、Rangeの前にシート名を付け加えたりしたのですが、どうにもウマく行きません・・・ どうしたらよいのでしょうか? コード: Dim i Dim j Dim n i = 2 j = 2 n = 1 Do While whois.Range("Ai") <> "END" Do While j <> "END2" If whois.Range("Ai") = totalpass.Range("Aj") Then If whois.Range("Ci") <> totalpass.Range("Ej") Then whois.Range("Ai:Ii").Copy ansdiff.Range("An:In").Paste n = n + 1 End If Else j = j + 1 End If Loop j = 2 i = 2 Loop

  • Pascal言語で小町算

    Pascal言語で、『1~9の順に数字を並べ、+、-を補い式を作り、 値が100になる組み合わせをすべて出力するプログラムを作成せよ(例:12 - 3 - 4 + 5 - 6 + 7 + 89 = 100)。』 という課題が出ました。自分なりに組んでみたのですが、 12個あると聞いたのに、4個しか出力されません><; どこが間違っているのかご教授いただけると幸いですっ ------------------------------------------------------- program KomachiZan(output); var i,s:integer; var sign:array[1..9] of integer; var x,n:longint; begin writeln('< 小町算 -Komachi Zan- >'); for i:=1 to 9 do sign[i]:=-1; repeat x:=0; n:=0; s:=1; for i:=1 to 9 do begin if sign[i]=0 then n:=10*n+1 else begin x:=x+s*n; s:=sign[i]; n:=i; end; end; x:=x+s*n; if x=100 then begin for i:=1 to 9 do begin if sign[i]=1 then write(' + ') else if sign[i]=-1 then write(' - '); write(i); end; writeln(' = 100'); end; i:=9; s:=sign[i]+1; while s>1 do begin sign[i]:=-1; i:=i-1; s:=sign[i]+1; end; sign[i]:=s; until sign[1]>=1; end. -------------------------------------------------------

  • テキストボックス2列の値をシート1AB列に入力

    実行2クリックで2列のテキストボックス1~7の値をsheet1のA列、テキストボックス11~17の値をB列に入力したいのですが下記の方法にどうコード追加していいのかわかりません。どなたかコードが解る方よろしくお願いします。 Private Sub 実行2_Click() For i = 1 To 1000 If Sheet1.Cells(i, 1.Value = vbNullString Then: Exit For Next For Each o In UserForm1.Controls Dim c As MSForms.Control Set c = o If c.Name Like "TextBox*" Then Dim t As MSForms.TextBox Set t = c If t <> vbNullString Then Sheet1.Cells(i, 1.Value = t i = i + 1 t = vbNullString End If End If Next End Sub

  • MATLABの計算過程での質問です。

    はじめまして。 MATLABのコードでどうしてもわからないことがあり質問させていただきます。 問題はerrorの計算で起こります。 error=Σ[((F_n+1)-(F_n))/(F_n+1)] ループ内の計算がiter=1以降に進まなくなりました。 いろいろ編集してみましたが、どうしてもerrorのところがうまく働きません。 良かったらアドバイスよろしくお願いします。 tol=tolerance N=number of maximum iterationです ---------------------------------------------------------------- tol=0.01; N=100; A=zeros(26,26); f0=zeros(26,26); A(11:26,1)=100; A(26,1:16)=100; f=A; iter=1;f0=0 n=1; for n=1:N for i=2:26-1 for j=2:26-1 f(i,j)=(1/4)*(A(i+1,j)+A(i-1,j)+A(i,j+1)+A(i,j-1)) error(i,j)= sum(abs((f(i,j)-f0(i,j))./f(i,j))); end end if error <=tol break; else A=f; f0=f; iter=iter+1 end end

  • アルゴリズムの正当性について

    線形探索法のアルゴリズムの擬似コードを書いて、そのアルゴリズムの正当性をループ不変式を用いて証明するという課題があります。 擬似コードは以下のような流れにしようと思いますが、この場合成り立つループ不変はどのようなことになりますか? 配列A[a1..an]に対してv=A[i]ならば添字iを、vがAの中になければNILを出力するアルゴリズムです。 for i ←1 to N if A[i] = v return i return NIL