雲雀は高く空を舞い このページをアンテナに追加 RSSフィード

「ひよこは高く空を舞い」について

2006-06-10

[] ホームワーク  ホームワーク - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  ホームワーク - 雲雀は高く空を舞い  ホームワーク - 雲雀は高く空を舞い のブックマークコメント

関数の定義方法 - 雲雀は高く空を舞い - ひよこの会の続き

404 Not Foundの演習問題

半径 r の円の面積を返す関数を定義せよ。

def sCircle(r = 1.0)
  pi = 3.141592654
  return (r ** 2.0) * pi
end

実行結果

irb(main):001:0> sCircle
=> 3.141592654
irb(main):002:0> sCircle(4)
=> 50.265482464
irb(main):003:0> sCircle(19843)
=> 1236985296.85021

立方体の体積を返す関数を定義せよ。

def vCube(w = 1.0, d = 1.0, h = 1.0)
  return w * d * h
end

実行結果

irb(main):004:0> vCube
=> 1.0
irb(main):005:0> vCube(1,4)
=> 4.0
irb(main):006:0> vCube(6,2,48)
=> 576

円錐の体積を返す関数を定義せよ。

def vCone(r = 1.0, h = 1.0)
  pi = 3.141592654
  return ( ( (r ** 2.0) * pi )* h ) / 3.0 
end

実行結果

irb(main):007:0> vCone
=> 1.04719755133333
irb(main):008:0> vCone(3,24)
=> 226.194671088

原点から点 (x, y, z) までの距離を返す関数を定義せよ。

def distance(x = 0.0, y = 0.0, z = 0.0)
  return ( (x ** 2.0) + (y ** 2.0) + (z ** 2.0) ) ** 0.5
end

実行結果

irb(main):009:0> distance
=> 0.0
irb(main):010:0> distance(2,4,5)
=> 6.70820393249937
irb(main):011:0> distance(2)
=> 2.0

a^bb^a の値を表示する関数を定義せよ。

def exponent(a = 1.0, b = 1.0)
  return a ** b, b ** a
end

実行結果

irb(main):001:0> exponent(4,3)
=> [64, 81]


cat::ruby

,

トラックバック - http://chick.g.hatena.ne.jp/allegro/20060610

2006-06-09

[]関数の定義方法 関数の定義方法 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - 関数の定義方法 - 雲雀は高く空を舞い 関数の定義方法 - 雲雀は高く空を舞い のブックマークコメント

ここで関数とは、入力に対して出力を返すもの…大まかすぎる気がする。これでは、システムの様なものになってしまう。まぁいいや。

関数の定義はdef 関数名(仮引数,...) 〜 end で行なう。ここで、仮引数関数への入力となる変数

関数定義の例

[復習] 関数の実行方法

関数の実行は

ruby function.rb

関数irbライブラリとして読み込んで使うには

irb -r function.rb
関数定義の例
# x の3乗を返す関数 cube
def cube(x)
    x**3
end

# 2数の和を返す関数 sum
def sum(x,y) # 複数の仮引数はコンマで区切る
    x + y
end

# 0 を返す関数 zero
def zero     # 仮引数がないときは省略可
    0
end

これをファイルtest.rb に保存して実行したのが以下。このとき、ファイルの改行方法をWindows式(CR+LF)かUnix式(LF)にすること。Mac式(CR)ではシンタックスエラーとなる。

$ irb -r test.rb
irb(main):001:0> sum(43,243)
=> 286
irb(main):002:0> zero
=> 0
irb(main):003:0> cube(432)
=> 80621568
irb(main):004:0> sum(34,345) + cube(34)
=> 39683
irb(main):005:0> sum(43,zero)
=> 43
irb(main):006:0> cube(sum(4,3))
=> 343
irb(main):007:0> exit

また、cube(4), sum(4,3)cube 4, sum 4,3のように( )を省略する事もできる

デフォルト引数

引数デフォルト値を設定する事で入力を省略する事が出来る。デフォルト値の設定はdef function(x, y=0) ... endのように、「仮引数=デフォルト値」とする。また、このとき、引数は、デフォルト値のない引数デフォルト値のある引数の順に記述する必要がある。

# 3数までの数値の和 sum
def sum(x, y=0, z=0)
    x + y + z
end

# xのn乗根(省略すれば平方根)を返す関数 root
def root(x, n=2)
    x ** (1.0 / n)
end

実行結果

$ irb -r test.rb
irb(main):001:0> sum(1,2)
=> 3
irb(main):002:0> sum(1,2,3)
=> 6
irb(main):003:0> sum(1)
=> 1
irb(main):004:0> root(3)
=> 1.73205080756888
irb(main):005:0> root(4,4)
=> 1.4142135623731
irb(main):006:0> exit

変数の有効範囲(スコープ)

ローカル変数は、それが定義された範囲内(def ~ enddo ~ endなど)でしか有効ではない。

x = 1          # (1) 変数 x の定義
               # (2)
def f(x)       # (3) 仮引数 x の定義(?)
    y = 2      # (4) 変数 y の定義
    y * x + y  # (5)
end            # (6)
               # (7)
def g(n)       # (8) 仮引数 n の定義(?)
    n + 1      # (9)
end            # (A)
               # (B)

このような関数があった時にそれぞれ

(1)で定義されたx は、 (1)(2)(7)(B)で有効

(3)で定義されたx は、 (4)(5)で有効

(4)で定義されたx は、 (5)で有効

(8)で定義されたx は、 (9)で有効

ロック内で定義された変数(ローカル変数)は、そのブロックをぬけると有効範囲を外れ、破棄される。一方、(1)のようにどのブロックにも属さない範囲(トップレベル)で定義されたローカル変数プログラム終了まで残る。

ホームワーク

  1. 半径 r の円の面積を返す関数を定義せよ。
  2. 円錐の体積を返す関数を定義せよ。
  3. 立方体の体積を返す関数を定義せよ。
  4. 原点から点 (x, y, z) までの距離を返す関数を定義せよ。
  5. a^bb^a の値を表示する関数を定義せよ。


cat::ruby

,

2006-06-06

[]ふぃぼなっち(2) ふぃぼなっち(2) - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - ふぃぼなっち(2) - 雲雀は高く空を舞い ふぃぼなっち(2) - 雲雀は高く空を舞い のブックマークコメント

下にかいたフィボナッチ数列を求める関数fib()再帰関数の例として。n が自然数で無いときのことを考慮してないけど、フィボナッチ数列の定義に沿った、いまの僕には割と自然な書き方かな。

再帰を使わないで繰り返しでやる方法もあるだろうし、他にも書き方はいくらでもあると思うので、これはあとでやる。

あと、再帰と繰り返しとどっちが早いんだろう、とか、もっと早くするには何か最適化できるんだろうか、とか思うけど、うーん。今のところよく分からん。

あ、一般項計算しちゃえよ、ていうのもあるか。

一般項については

http://chick.g.hatena.ne.jp/kiri-no/20060606/1149583529

id:kiri-noがまとめてるので、そちらを参照のこと。

[]ふぃぼなっちふぃぼなっち。 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - ふぃぼなっち。 - 雲雀は高く空を舞い ふぃぼなっち。 - 雲雀は高く空を舞い のブックマークコメント

def fib(n)
  if n == 1 
    return 1
  elsif n == 2
    return 2
  elsif n > 2
    return fib(n-1)+fib(n-2)
  end
end

skypeしてて話題に上ったので。n番目のフィボナッチ数列を求めるプログラム

elseifじゃなくてelsifなのね。これに気がつかなくて、てどれだけ初歩的な、てか注意力の問題だよね。中身についてはまた後ほど。とりあえず、眠い。

15番目のフィボナッチ数が987

20番目のフィボナッチ数が10946

40番目のフィボナッチ数が……計算が終わりません。

追記2

40番目のフィボナッチ数は165580141でした。

Rubyで実行時間を計るには何を使ったらいいんだろね。

追記2

フィボナッチ数の定義は、F(1) = 1, F(2) = 1, F(n) = F(n-1) + F(n-2) だった。

,

トラックバック - http://chick.g.hatena.ne.jp/allegro/20060606

2006-06-04

[]数値と演算子 数値と演算子 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - 数値と演算子 - 雲雀は高く空を舞い 数値と演算子 - 雲雀は高く空を舞い のブックマークコメント

数値

Rubyで扱える数値には整数と浮動小数点がある.

整数

-255 =-0377 =-0xff =-0XFF

それぞれ、10進数、8進数、16進数。8進数は0で始まり、16進数は0x/0Xで始まる。

083 , 0xG などはsyntax errorになる。

booleanはあるのかな?

浮動小数

3.14, .14, 3.0, 6.02e23( = 6.02\times10^{23}), 5.1e-5( = 5.1\times10^{-5}), 6e-1 ( = 6.0\times10^{-1})

演算子

四則演算+α
+
加算
-
減算
*
乗算
/
除算 (整数÷整数の計算の答えは整数に丸められる)
%
除算で商を整数とした余り
**
累乗 (乗除算よりも優先される。また連続してある場合は後ろから実行される)
整数の非負整数乗は整数で、それ以外は浮動小数
0**00**0.00 になるが、 0.0**00.0**0.0NaN (Not a Number)(どういう意図で?)
インスタンスメソッド
数値.abs
数値の絶対値を表示
数値.floor
数値を超えない最大の整数
数値.round
数値の小数点以下を四捨五入
数値.ceil
数値を下回らない最小の整数
数値.truncate
数値の0方向の丸めて整数
数値.to_i
数値を0方向へ丸めて整数に (same as truncate)
数値.to_f
数値を浮動小数に

これらの演算は他の演算子よりも優先度が高い

また、他にどのようなメソッドがあるかはinteger (整数), float (浮動小数)により、以下を参照。

ref:Math, ref:Bignum, ref:Fixnum, ref:Numericなども参照。

[]数学のためのRuby入門 4-2 数学のためのRuby入門 4-2 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - 数学のためのRuby入門 4-2 - 雲雀は高く空を舞い 数学のためのRuby入門 4-2 - 雲雀は高く空を舞い のブックマークコメント

404 Not Foundのホームワーク

  1. 2の平方根と立方根を計算せよ。
  2. (1+\sqrt{2})(1-\sqrt{2}) を計算せよ
  3. 2^6+1 を 10 で割った余りを求めよ
  4. \frac{22}{7} の小数第四位を四捨五入して、小数第三位まで求めた値を計算せよ

1) 2の平方根と立方根を計算せよ。

irb(main):003:0> 2.0 ** (1.0/2.0)
=> 1.4142135623731

** で累乗の計算. ** は四則演算に優先するので, 1 / 2 を先に計算するために ( ) で囲む.

また,1 / 2とした場合, 12がインテジャ(整数)扱いされてしまうため,1.0 / 2.0として計算する.以下に例を示す.

irb(main):004:0> 1/2
=> 0
irb(main):006:0> 1.0/2
=> 0.5
irb(main):007:0> 1/2.0
=> 0.5

三乗根も同様.

irb(main):008:0>  2.0 ** (1.0 / 3.0)
=> 1.25992104989487

2) (1+\sqrt{2})(1-\sqrt{2}) を計算せよ

irb(main):015:0> ( 1.0 + (2.0 ** (1.0/2.0))) * ( 1.0 - ( 2.0 ** (1.0/2.0)))
=> -1.0

特に問題なし.

3) 2^6+1 を 10 で割った余りを求めよ

irb(main):010:0* ((2.0**6)+1) % 10
=> 5.0
irb(main):011:0> ((2.0**6)+1)
=> 65.0

特に問題なし.

4) \frac{22}{7} の小数第四位を四捨五入して、小数第三位まで求めた値を計算せよ

irb(main):016:0> 22.0/7
=> 3.14285714285714
irb(main):017:0> 22.0/7.0*1000
=> 3142.85714285714
irb(main):019:0>  ( 22.0 / 7.0 * 1000 ).round / 1000.0
=> 3.143

.round は数値の小数点第1位を四捨五入するメソッド.それを使うために,数値を1000倍して数値の小数点第4位を小数点第1位に持ってくる.そこで .round により四捨五入,今度は1/1000して元の数値を得る,と.

こんなのピーナッツですな。


cat::ruby

,


[] 変数変数の代入  変数と変数の代入 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  変数と変数の代入 - 雲雀は高く空を舞い  変数と変数の代入 - 雲雀は高く空を舞い のブックマークコメント

404 Not Foundより

変数の命名規則

ある特定の値を保存するもの、あるいは不定の値の代わりをするもの。

命名は小文字の英字か_で始まり,英数字か_が続く名前ならOK.

参考) Rubyのコードを書くにあたってのコーディング規約

Rubyコーディング規約

また、予約語としてあらかじめ使われている文字列がある. これは変数名として使用する事が出来ない.

予約語はこのエントリの最後に掲載.

以下に変数名として使えるもの,使いないものの例を挙げる.

変数名として可能
  • x
  • pi
  • eulerGamma
  • log2_10
  • _DEGREE_
変数名として不可能
  • ArcTangent大文字で始まっている)
  • 2pi (数字で始まっている)
  • exp2.5 (アンダースコア以外の記号が入っている)
  • next予約語

値の代入と参照

x=3 のように、左側に変数、右側に値を書くことで、変数に値が保存されます。これを(変数への値の)代入と呼びます。代入された値は、他の値を代入したり、変数のスコープを抜ける(後述)までは保持されます。代入された値を使うときは、変数をそのまま数値などと同じように書きます。このことを(変数の値の)参照と言います。

404 Not Foundより

自己代入

変数の値を増やすために x = x + 3 といったことをよく行います。これを省略して、 x += 3 と書くことができます。同様に、 -=, *=, /=, %=, **= も使えます。こういった、変数自身との演算結果をその変数に代入するような演算子を、自己代入演算子といいます。

404 Not Foundより

以下に例を示す.

irb(main):023:0* x = 10
=> 10
irb(main):024:0> x += 2
=> 12
irb(main):025:0> x *=3
=> 36
irb(main):031:0> x ** 0.5
=> 6.0

予約語一覧

  • alias
  • and
  • begin
  • break
  • case
  • class
  • def
  • defined
  • do
  • else
  • elsif
  • end
  • ensure
  • false
  • for
  • if
  • in
  • module
  • next
  • nil
  • not
  • or
  • redo
  • rescue
  • retry
  • return
  • self
  • super
  • then
  • true
  • undef
  • unless
  • until
  • when
  • while
  • yield
トラックバック - http://chick.g.hatena.ne.jp/allegro/20060604

2006-06-03

[]Ruby始めます。 Ruby始めます。 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - Ruby始めます。 - 雲雀は高く空を舞い Ruby始めます。 - 雲雀は高く空を舞い のブックマークコメント

手を広げすぎな気がするんだが。まぁ、1日1ジャンルくらい出来たら良いな、と思いつつ。

Rubyを始めてみようと思ったのは「404 Not Found」と言うページを見つけたので。割と数学演算が可能である、という記述を見るので挑戦してみることにした。

もっとも、本格的にやるならmatlabとか、あるいはフリーでRという最強の環境もあるので、とりあえずはこれを通してRubyを1通り読めるようになること、が目的かな。Rは特に触るつもりはないけど、数学処理、特に統計処理をするなら最強の環境かと思います。

数学のためのRuby入門

Rによる統計処理

[]「数学のためのRuby入門」より (1) Rubyとは 「数学のためのRuby入門」より (1) Rubyとは - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - 「数学のためのRuby入門」より (1) Rubyとは - 雲雀は高く空を舞い 「数学のためのRuby入門」より (1) Rubyとは - 雲雀は高く空を舞い のブックマークコメント

Rubyの特徴

404 Not Foundより。

あと、

  • 最近流行ってる

とか。

リファレンス

とか。また、ri method名でコマンドマニュアルを表示。

[] インストール方法  インストール方法 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  インストール方法 - 雲雀は高く空を舞い  インストール方法 - 雲雀は高く空を舞い のブックマークコメント

Windowsの場合はダウンロードとかを参考に。

Mac OS Xの場合ははじめから入ってるので特に問題なし。バージョンアップする方法は…後ほど。

インストールされてるRubyのバージョンを知るには

$ ruby -v
ruby 1.8.2 (2004-12-25) [powerpc-darwin8.0]

…ちょっと古いか。

[]とりあえず動かしてみよう とりあえず動かしてみよう - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - とりあえず動かしてみよう - 雲雀は高く空を舞い とりあえず動かしてみよう - 雲雀は高く空を舞い のブックマークコメント

404 Not Foundより。

 1) def sum(first, last) # summing from first to last
 2) 	s = 0
 3) 	for i in (first..last)
 4) 		s += i
 5) 	end
 6) s
 7) end
 8) 
 9) puts sum(1, 10)       # summing from 1 to 10
10) puts sum(84, 2500) # summing from 84 to 2500

(※ 行頭の数字はプログラム実行にあたり不要)

このプログラムエディタで書き、適当なフォルダ適当な名前.rbで保存する。

ここでは~/rubytest/sum.rbで保存する。実行するにはruby sum.rbで。

ruby sum.rb

55
3122764

となった。

以下、適当に。

  • コメントは#
  • for文は  for i in (first..last) endで。
    • (first..last).....としたところputs sum(1, 10)が45となった。1<=i<=10が1<=i<10になったのかな?
  • putsで行末改行するテキスト出力
  • 変数の宣言は特に必要ない
  • 関数の定義はdef

[]irb - interactive ruby irb - interactive ruby - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - irb - interactive ruby - 雲雀は高く空を舞い irb - interactive ruby - 雲雀は高く空を舞い のブックマークコメント

引き続き、404 Not Foundより。

コマンドプロンプトでirbとするとrubyの対話型実行環境が起動する。これによってrubyコマンドの一行ごとの実行が可能となる。またirb -r function.rbとする事で適当なfunction.rbをライブラリとして読み込んで実行できる

irb
irb(main):001:0> 3-3
=> 0
irb(main):002:0> 5*6
=> 30
irb(main):003:0> exit
irb(main):001:0> exit
Mashiro:~/test sora$ irb -r sum.rb
55
3122764
irb(main):001:0> sum(4,30)
=> 459
irb(main):002:0> sum(-4,3)
=> -4
irb(main):003:0> exit


cat::ruby

,

トラックバック - http://chick.g.hatena.ne.jp/allegro/20060603
テクノラティプロフィール