Rubyでパスカルの三角形を作成する方法

このQ&Aのポイント
  • Rubyの2次元配列を使ってパスカルの三角形を作成する方法を解説します。
  • パスカルの三角形の作成方法についてRubyのコードを用いて説明します。
  • Rubyのプログラムを使ってパスカルの三角形を生成する手順を詳しく解説します。
回答を見る
  • ベストアンサー

パスカルの三角形をRubyで作る際、2次元配列をつかって、以下のように

パスカルの三角形をRubyで作る際、2次元配列をつかって、以下のようになりました。 ビットファイルの作成部分や、ピクセルの指定の部分は省略します。 pas = Array.new(HEIGHT) {|i| Array.new(WIDTH, 0)} pas[0][WIDTH / 2] = 1 for i in (1..HEIGHT - 1) for j in (1..WIDTH - 2) pas[i][j] = pas[i - 1][j - 1] + pas[i - 1][j + 1] end end この中で、pas[i][j] = pas[i - 1][j - 1] + pas[i - 1][j + 1]とありますが、 (i,j)=(1,1)とすると、pas[1][1] = pas[0][0] + pas[0][2]で、 (i,j)=(1,2)とすると、pas[1][2] = pas[0][1] + pas[0][3] で続いていくわけですが、これでパスカルの三角形がなぜかけるのか、非常に疑問です。 どなたか、このプログラムがどうしてパスカルの三角形が書けるのか、プログラムの流れに沿って解説できる方、いらっしゃいませんか?

  • ghfjri
  • お礼率92% (372/403)
  • Ruby
  • 回答数2
  • ありがとう数28

質問者が選んだベストアンサー

  • ベストアンサー
  • gcqd75ce
  • ベストアンサー率8% (6/67)
回答No.2

中学数学でいけますよ。 がんばれ-♪

ghfjri
質問者

お礼

回答ありがとうございます? 中学の数学? パスカルの三角形がどういうものかは知っていますが・・・? プログラミングの二次配列を使ったものですので、そんな簡単なわけが・・・・? まあ、他の回答者の皆さんの意見を見ても簡単らしいので、簡単なのかもしれませんが、わからないのですが・・・あれ?

その他の回答 (1)

  • gcqd75ce
  • ベストアンサー率8% (6/67)
回答No.1

簡単なことは自分で調べましょう。 中学数学でいけるはずです。 「帝席は自分で学べ」とか。あ、帝は亭でしたか? 国語は苦手なんで。

ghfjri
質問者

お礼

回答ありがとうございます。これって簡単なことなんですか? いちおうグーグル先生には聞いたんですけど、回答が高度すぎてついていけなかったのです・・・。 2chも見ましたが、ぜんぜんわかりませんでした。 前の回答者の方も中学数学がどうこうおっしゃってましたので、その辺がミソなんでしょうか? まあ、がんばってみますが、3日前からずっと考えてるんですが・・・。

関連するQ&A

  • ギャスケット作成。修正の解説をお願いします。

    ギャスケット作成。修正の解説をお願いします。 入門書の問題で、二次元配列を使ってパスカルの三角形を作り、そこからシェルピンスキーのギャスケットを作りたいと思い、以下のプログラムを書きました。 ピクセルの指定の部分は省略します。 (↓パスカルの三角形の部分) pas = Array.new(HEIGHT) {|i| Array.new(WIDTH, 0)} pas[0][WIDTH / 2] = 1 for i in (1..HEIGHT - 1) for j in (1..WIDTH - 2) pas[i][j] = pas[i - 1][j - 1] + pas[i - 1][j + 1] end end で、2行目のpas[0][WIDTH / 2] = 1の、「WIDTH / 2」がまずかったらしく、パスカルの三角形の左下と右下が残念な感じになってしまいます。左下はすっぽ抜けていますし、右下には必要ないところで三角形が入ってきています。何でこんなことになるんでしょうか?簡単な言葉で説明してくださると助かります。 答えを見ると、「WIDTH / 2」を「WIDTH」に、「WIDTH」を「WIDTH*2」にかえてうまく出来てるんですが、なんでそうなるのっていう感じです。 私が持っている入門書の解説には、「加えるべき数字が利用できないことが原因です」とだけしか解説してません。 ここからはあまり関係ないと思うのですが ビットマップファイル作成の部分です。 File.open("gasket.bmp", "wb") do |file| file.write(["BM", HEADERS_LEN + WIDTH * HEIGHT, 0, HEADERS_LEN].pack(BITMAPFILEHEADER)) file.write([INFOHEADER_LEN, WIDTH, HEIGHT, 1, 8, 0, 0, 0, 0, COLOR_USED, COLOR_USED].pack(BITMAPINFOHEADER)) file.write("\xff\xff\xff\0") file.write("\0\0\0\0") (HEIGHT - 1).downto(0) do |y| 0.upto(WIDTH - 1) do |x| if pas[y][x] % 2 == 0 file.write("\0") else file.write("\x01") end end end end uptoの前の部分が0になっていますが、正解例は320になっています。ちなみに、ピクセル指定の部分で、WIDTHは640になっています。これもなんだかよくわかりません。 私は、一行目で配列のすべてにゼロが入っているから、「加えるべき数字」である数はすべての配列に入っていて、 Nilになるところはないと思うのです。 グーグル先生には聞きましたが、わかりませんでした。一言でもかまいませんので、どうか、よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Rubyで配列を使ったfor文の中に条件つきif文

    Rubyで配列を使ったfor文の中に条件付きのif文を入れてループさせたいのですが、基本的な構文が分かりません。 for i in array     if i == 9       array[i] << 'ア'     end end という雰囲気で書きたいのですが、どうしたらよいでしょうか。 i番目のループまで、配列のarrayを走査するにはどうすればよいでしょうか。 基礎的な質問ですみません。よろしくお願いします。

  • jspでの二次元配列

    こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{  public static void main(String args[]) throws IOException{      String csv = "dognum.csv";      BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }

  • 配列の次元を超えてランダムに選択したい

    PHP5.2.4を使用しています。 例えば、次のような2次元以上の配列があったときに $arr[0][0] = array('a' => 1, 'b' => 11); $arr[0][1] = array('a' => 2, 'b' => 5); $arr[0][2] = array('a' => 3, 'b' => 20); $arr[1][0] = array('a' => 4, 'b' => 3); $arr[1][1] = array('a' => 5, 'b' => 30); この5つから、'b'の値が10以上の候補だけのインデックス($arr【[1][1]】←この部分)を ランダムに1つ選ぶ方法はどのようになるのでしょうか? 自分が考えたのは for ($i = 0; $i < count($arr); $i++) {  for ($j = 0; $j < count($arr[$i]); $j++)  {   if ($arr[$i][$j]['b'] < 10)    continue;   $new_arr[] = array('index2' => $i, 'index1' => $j);  } } $key = array_rand($new_arr, 1); print_r($new_arr[$key]); //Array ( [index2] => 0 [index1] => 0 ) //Array ( [index2] => 0 [index1] => 2 ) //Array ( [index2] => 1 [index1] => 1 ) //いずれかが選択される なんですが、これだとあまり良いやり方だと思わなくて なにか別のやり方はあるのでしょうか?

    • 締切済み
    • PHP
  • 二次元配列に値をセットしたいんですが

    ASP(html)での変数をJavaScriptに渡して 二次元配列を作成したいのですが、どうもうまくいきません。 どなたか、ご教授願います。 サンプル 変数:strFact = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" -------------------JavaScript strFact_WK = <%=strFact %>  ※1 var test = new Array(); var rows = strFact_WK.split("/"); for( var i in rows) { test.push(new Array()); var cols = rows[i].split(","); for( var j in cols) { test[i].push(cols[j]); } } ---------------------- 当然ですが、 ※1の所で strFact_wk = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" とすると作成されます。

  • パスカルの三角形

    一次元配列でパスカルの三角形を表示したいのですがうまくいきません。三角形の左上と右上をうまく足すことが出来ません。教えてください。作ってみたプログラムを載せます。 int comb[N+1]; int i,j,a; int main (){ for(i=0;i<=N;i++){ comb[i]=0; } for(i=0;i<=N;i++){ for(j=0;j<=i;j++){ if(j==0||j==i){ comb[j]=1; }else{ comb[j]=comb[j]+comb[j-1]; } } printf("\n"); }

  • 多次元配列とfor文について

    javascriptの配列について質問です。 例えば: var arrXXX = new Array(); function samplefunc{ //3次元配列の種類の作成 for (m = 0; m < aaa.length ; m++) { //連想配列作成 arrXXX .push(aaa[m]); } for (j = 0; j < bbb.length; j++) { for (i = 0; i < ccc.length; i++) { arrXXX[aaa[j]] = new Array(ccc.length); arrXXX[aaa[j]][i] = new Array(ccc.length); for (k = 0; k < ddd.length; k++) { arrXXX[aaa[j]][i][k] = eee;     ここでは配列を適切に使える・・・ } } } ここでarrXXXを使いたいが、3次元配列でなくなっている?!  arrXXX[~][0][0]はnullまたはオブジェクトではありません・・・がでます。 } 結局、for文を完全にでてしまうと、せっかくつくった配列がダメになってしまいます。どうすればfor文外で配列を使用できるのか教えてください!

  • 多次元配列がさっぱりです。

    var img = ["test01.jpg", "test02.jpg", "test03.jpg", "test04.jpg"]; var name = ["テスト1", "テスト2", "テスト3", "テスト4"]; for (var i = 0; i < img.length; i ++) { document.write('<img src="../img/' + (img[i]) + '" width="132" height="160" border="0" />' + '<br />'); for (var j = 0; j < name.length; j ++){ document.write((name[j])); } } 全然駄目です・・・ 画像があって、画像の下に var name を表示したいんですが、分かりませんでした。分かるかた、教えてください!

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • 2次元配列のポインタ

    整数型行2列2の2次元配列の[1][0]は、ポインタでは3になるとおもっているのですが、ちがったでしょうか? 下記のソースでエラーが出ていて困っています。 void main() { int array[2][2] = { { 9, 9 }, { 9, 9 } }; int num=2, j,i; *(array + 3) = 0; for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { printf("%d", array[i][j]); } puts(""); } } 99 09 と表示させたいのですが、どこに間違いがあるのでしょうか?

専門家に質問してみよう