fun geCnt():Intは値を返す関数です。fun conterUp()は値を返さない関数です。fun counterUp():Unitと書いてもいいのですが、この場合は省略できるんだそうです。
もう一個同じようなクラスを作ってみました。一般的には後の方が多いようにも思います。従来の考えからすると上のようにも思います。どっちでもいいのかもしれません。"(-""-)"
体調不良のため、しばらくお休みします。(*_*;
fun geCnt():Intは値を返す関数です。fun conterUp()は値を返さない関数です。fun counterUp():Unitと書いてもいいのですが、この場合は省略できるんだそうです。
もう一個同じようなクラスを作ってみました。一般的には後の方が多いようにも思います。従来の考えからすると上のようにも思います。どっちでもいいのかもしれません。"(-""-)"
体調不良のため、しばらくお休みします。(*_*;
20!迄は正常ですが、21!以上はおかしくなりました。何故エラーにならないんですかね?
ローカル関数はfun sumの中にfun RecursiveDoを定義してます。sumからは内部のRecursiveDoだけが見えるようです。kai((1L..100).toList())をやってみたんですが、何故か0でした。オーバーフローと出ないです?ちょっと確かめられないくらい大きい数でした。Bigとかの数値もあるんですかね?
tailrecは何故必要かという話でした。上の図にあるように普通?に再帰関数を書くと、実行例にあるようにStachOverflowErrorが起きる可能性があります。それを防ぐためでした。tailrec fun RecursiveRuikeiでは二個目の出力が出てます。「kotlinスタートブック」の通り、自分のPCもエラーが起きました。
tailrecを使って、1から123456までの集計をしてみました。昔偉い人が子供の時に算数の問題を出されて、回答した方法です123457*(123456/2)=7620753696となるみたいです。この場合は要素がなくなった時は0で良いのでしょうが、下の図では1となるようです。Ruikeiの引数がList型とInt型では受け取り方、forが微妙に違います。多分ですが最後に0を掛けてしまわないようにですかね?最後は1を掛ける。
実行時間を正確に測ったわけではありませんが、再帰関数は時間がかかるようです。最初と最後はすぐプリントされますが、真ん中は結構時間がかかります。
最後に各々をプリントする場合を入れてみました。
「Kotlinスタートブック」のP75をそのままにRecursiveRuikeiを作ったというか?コピーしました。RuikeiもListを受けたものに変えてみました。tailrecを使うには、もしかしたら関数部分を=で書かないといけないのかもしれません。前は{}で書いてました。
前のパターンのRuikeiを入れました。どうやら同じ関数名でも引数のタイプで上手く選んでくれてるようです。
例えば5階乗=1x2x3x4x5=120で、10階乗=3628800になるようです。
1から10までの累計は55です。RubyやScalaは最後の結果がreturnされたと思いますが、kotlinでは{}の中に書いた場合は、returnは必須です。関数のタイプも必須だったと思います。Kotlinスタートブックの例題はこれとは違いますが、ちょっと難しいので後にします。"(-""-)"
可変長引数と配列を引数にすると結構似てますね。この場合の集計部分は全く同じです。引数を受ける定義が違います。渡す方も微妙な違いがあるようです。同じことができるようなので、どっちか覚えておけばいいかな?"(-""-)"
名前付き引数を使えば、複数の引数があるときに順番を気にせず使えるかもしれません。デフォルトを使えば、省略時に使われる引数を指定できます。
fun goukei(ary:Array<Int>) : Int {の:Intを省略できない。関数の名前goukeiと変数の名前goukeiは区別されるようですので、同じでも問題ない様です。
関数の返す値を省略できます。引数に書いてあるので、推定できるからのようです。fun square(n:Int):Int=n*nで後の方の:Intを省略できます。Kotlinスタートブックではhelloの例が"hello, $name!"とあります。${name}との違いは何なんですかね?三番目の例では、例えばval a = if()とかもかけるので違和感はないでしょう。
fun succとfun nextは同じですが、=を使うか{}を使うかで少し違います。{}で定義した場合はreturnが無いと赤波線アンダーラインでエラーになります。
上の図でDoubleクラスにplusを追加したように見えます。悩んでいたのが、Complexクラスに書いていたのでエラーになってました。これによってobj1+50.0と50.0+obj2と両方で書けるようになりました。
operator fun Int.plusをRationalクラスから外れたところで書きます。
import ktsp035.Rationalともう一つktsp035.plusもimportしないとダメでした。これで少しは拡張関数を分かった気持ちです。"(-""-)"
上の図でpackage ktsp035でClass等を他から見えなくします。「Kotlinスタートブック」の例題からですが、元は「Scalaスケーラブルプログラミング」から参考にしたものです。
上の図ではimportでktsp035のクラスを見えるようにします。private fun gcdもimportしないとダメかと思ってましたが、必要ない様です。mainの部分をコピーしたらimportが必要と判断してくれました。