アカウント名:
パスワード:
古代の昔から、処理系が持つ標準の関数が遅いのでテーブル使うなり自分で関数を置き換えるなりするなどして高速化するのは当たり前だったし、今回はたまたまオープンソースだったからそれを指摘しただけだよね?マクロを外に出すとかも古代からあるテクニックだし、所詮埋もれてた問題にたまたま気づいただけとしか思えない。というか、ver upの際に低速化したのなら、明らかにその部分を担当した人間のミスでしょう。
Rubyを63%高速化って言っても、特定の用途の処理を行う際に高速化されただけで、これによる恩恵を受けるユーザはそれほど多くないように思う。これくらいのことはOSS界では日常茶飯事だし、職場でも毎日のように遭遇することなんだけど、記事にするほど珍しいことなの?
#そもそもフィボナッチ数列って業務的にはほとんど使わないよね
ホントにフィボナッチ数列が欲しけりゃ、人間がやっている手順そのままにやったほうが、一億倍マシです。
つまり再帰で書けということか。
(define (fib n) (cond ((= n 1) 1) ((= n 2) 1) (else (let fib-iter ((k 3) (fk-1 1) (fk 2)) (if (= n k) fk (fib-iter (+ k 1) fk (+ fk-1 fk))))))) (fib 10)
フィボナッチ数列に関しては、教科書的にはこういう風に書かんけどな。泥臭いから。でも、Schemeなら、こういう感じのコードはよく書く。脳内末尾再帰最適化でループにしか見えないし、末尾再帰の最適化が当然のSchemeの処理系には優しいから。
fib-iterのとる引数と手続き(関数)そのものも意味は一定だし、手続き自体は第1引数がnと等しいときに、第3引数を返す、そうでないときは第1引数を1つ増やしたときの条件で引数をとり直して、第1引数がnと等しいかを評価して、真であれば第3引数を返して、そうでないときは...、の繰り返し。人間のやっている手順そのまんま。
末尾再帰の最適化なんかしたら、手続き型と一緒じゃん、と言われれば、その通りなんですけど、見た目は再帰。
#引数のnは1以上の整数しか取らないことが前提。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall
いたって普通じゃないの? (スコア:0)
古代の昔から、処理系が持つ標準の関数が遅いのでテーブル使うなり自分で関数を置き換えるなりする
などして高速化するのは当たり前だったし、今回はたまたまオープンソースだったからそれを指摘
しただけだよね?
マクロを外に出すとかも古代からあるテクニックだし、所詮埋もれてた問題にたまたま気づいただけ
としか思えない。というか、ver upの際に低速化したのなら、明らかにその部分を担当した人間の
ミスでしょう。
Rubyを63%高速化って言っても、特定の用途の処理を行う際に高速化されただけで、これによる恩恵を
受けるユーザはそれほど多くないように思う。
これくらいのことはOSS界では日常茶飯事だし、職場でも毎日のように遭遇することなんだけど、
記事にするほど珍しいことなの?
#そもそもフィボナッチ数列って業務的にはほとんど使わないよね
Re: (スコア:1, 参考になる)
Lispや関数型言語も多いですね。
JavaやC++関係では、ほとんど見たことが無いのですけど。
つまり、あなたや私が知らないだけで、この世の中にはフィボナッチ数列を日常的に必要としている人が結構いるということではないでしょうか?
フィボナッチ数列(Re:いたって普通じゃないの?) (スコア:1)
>必要としている人が結構いるということではないでしょうか?
世の中に出回っている、”fib.rb" とかのコードは再帰関数呼び出しの
ベンチマーク・デモ用です。いわば、わざと非効率なことでコンピュータを
いじめてるようなもんです。
ホントにフィボナッチ数列が欲しけりゃ、人間がやっている手順そのままに
やったほうが、一億倍マシです。
ま、それが判るようになるのもアルゴリズムの勉強の一環なんですがね。
Re:フィボナッチ数列(Re:いたって普通じゃないの?) (スコア:0)
つまり再帰で書けということか。
フィボナッチ数列に関しては、教科書的にはこういう風に書かんけどな。泥臭いから。でも、Schemeなら、こういう感じのコードはよく書く。脳内末尾再帰最適化でループにしか見えないし、末尾再帰の最適化が当然のSchemeの処理系には優しいから。
fib-iterのとる引数と手続き(関数)そのものも意味は一定だし、手続き自体は第1引数がnと等しいときに、第3引数を返す、そうでないときは第1引数を1つ増やしたときの条件で引数をとり直して、第1引数がnと等しいかを評価して、真であれば第3引数を返して、そうでないときは...、の繰り返し。人間のやっている手順そのまんま。
末尾再帰の最適化なんかしたら、手続き型と一緒じゃん、と言われれば、その通りなんですけど、見た目は再帰。
#引数のnは1以上の整数しか取らないことが前提。