rubyプログラミングおしえてやんよ5

このエントリーをはてなブックマークに追加
1ローカルルール・名前欄変更議論中@自治スレ
Part5
次おちたらねるわ
2ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:37:00.54 ID:oYEnBCtf0
def takansinaFunction
  x = 0
  -> do
    puts x+=1
  end
end

a = takansinaFunction
b = takansinaFunction

a.call
a.call

b.call
b.call
b.call
3ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:38:44.17 ID:dMVka9xM0
前スレで高階関数を尋ねた者です

例えば
関数と自然数をとって、その関数を自然数回適用する関数を返す関数
はどのように書けますか?

f(1を足す関数,5) => 5を足す関数
みたいなのです

素人ですみません
4ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:42:31.18 ID:oYEnBCtf0
def func f , n
  n.times do
     f.call
  end
end

x = 0
func lambda { puts x+=1 } , 5


こうかな?
5ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:43:10.16 ID:jEA+kf5d0
保守スクリプト作らないの?
6ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:45:40.85 ID:oYEnBCtf0
保守ばかりで内容のないスレにしても仕方ないし
あと何日かvipに立て続けたら消える予定
7ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:46:43.13 ID:oYEnBCtf0
>>4

よく3の日本語よんだら全然ちがった
もう一回いってくる
8ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:48:19.76 ID:oYEnBCtf0
def func f , n
  lambda do
    n.times do
       f.call n
    end
  end
end

x = 0
f = func lambda { |n| puts x+=n } , 5


f.call



こうかな
9ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:50:37.43 ID:dMVka9xM0
ありがとうございます
やっぱり手続き型言語って難しい

読みといてみます
10ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:56:06.68 ID:dMVka9xM0
思ってた動きと違う…
11ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:56:16.85 ID:oYEnBCtf0
ええええ
12ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:59:13.05 ID:9BJIwyxN0
Rubyだと関数自体はオブジェクトじゃなくて
procとかlambda使わないとオブジェクトにできないからそこらへんがややこしいのかも
13ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 21:59:59.03 ID:dMVka9xM0
すみません
環境の違いを認識できてませんでした

f(nをとってn+1を返す関数,5) => nをとってn+5を返す関数
みたいなのです
14ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:04:15.24 ID:dMVka9xM0
何度もすみません
15ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:04:31.52 ID:9BJIwyxN0
面白そうだからスレが落ちませんように
16ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:09:40.46 ID:x/cny/qD0
ほしゅ
17ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:10:12.90 ID:oYEnBCtf0
俺そんなむずかしい数学できないぽwww
とりあえず、ちょっと書き換えたかえたけど

> nをとってn+1を返す関数 func
っていうのはこう

func = -> n {
->{n + 1}
}


> f(nをとってn+1を返す関数,5)
っていうのは、呼び出し側はこう
f.call func , 5


>nをとってn+5を返す関数
っていうのがわからない

渡したfuncの扱いはどうしたらいいの
18ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:12:51.36 ID:oYEnBCtf0
全部つなげると今こうなってる


# nをとってn+1を返す関数 func
func = -> n {
  ->{n + 1}
}


f = -> func , n {
  # nをとってn+5を返す
  -> {
    n + 5
  }
  # func をどう使う?
}

# f(nをとってn+1を返す関数,5)
a = f.call func , 5

puts a.call
19ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:16:49.08 ID:dMVka9xM0
直感的には

f(func,0) = nをとってnを返す関数
f(func,n) = nをとってfunc( f(func,n-1)(n))を返す関数

みたいなかんじですが
rubyで書けるかは分からないです
20ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:17:36.17 ID:dMVka9xM0
あ、nがかぶった

21ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:18:42.16 ID:dMVka9xM0
修正

f(func,5) = nをとってfunc( f(func,4)(n))を返す関数

みたいのです
22ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:24:32.03 ID:oYEnBCtf0
よくわかんけどかいてみる

もしかしたら再帰って事かなぁ
23ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:28:00.61 ID:9BJIwyxN0
たぶんでけた
24ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:29:36.01 ID:9BJIwyxN0
def foo (function,loops)
lambda { |n|
sum=n
loops.times {
sum=function.call(sum)
}
return sum
}
end

aaa=foo(lambda{|n| n+1},5)

p aaa.call(1) #=>6
p aaa.call(2) #=>7

無名関数で再帰が書けるならもっとスマートになると思う
25ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:34:34.54 ID:nRa/4cK8P
ttp://web.archive.org/web/20051228130057/http://akademeia.info/main/math_lecturez/math_sosuu.htm#make_big_prime_number
このアルゴリズムをRubyの多倍長整数で実装して巨大な素数つくろう
26ローカルルール・名前欄変更議論中@自治スレ:2012/01/19(木) 22:35:32.71 ID:oYEnBCtf0
俺はもうわかんね

>>24
のであってるならもうそれで
27ローカルルール・名前欄変更議論中@自治スレ
>>24
ありがとうございます
再帰を使わずにこの関数を書けるってすごいですね
勉強になりました