SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
Copyright © 2014 TIS Inc. All rights reserved.
再帰で  
脱Javaライク
2015.2.21
TIS株式会社	
  
前出祐吾
Copyright © 2014 TIS Inc. All rights reserved. 2
自己紹介
TIS株式会社 戦略技術センター!
社内向けエンジニア基盤の整備

      ▶ Scalaの活用検証!
甲賀忍者!
東京デビュー(先月)!
@yugolf
Copyright © 2014 TIS Inc. All rights reserved. 3
Scalaってどうなの?
コード量が半分くらいに!	
  
!
とはいえ、Scalaって難しいんじゃないの?	
  
!
大丈夫、Javaのライブラリ呼べるし、Javaライクにも書ける
し。	
  
(その場合、コード量は半分にならないけど。。)	
  
!
ん!?
Copyright © 2014 TIS Inc. All rights reserved. 4
脱Javaライクしてファ
ンクショナルなプロ
グラマーになるんです。	
  
Copyright © 2014 TIS Inc. All rights reserved. 5
Javaライクってなんですの? 例:総和
1からnまでを全部足す。	
  
!
(めいっ	
  
ぱい、	
  
Javaっぽ	
  
く足す)	
  
def	
  sowa(value:	
  Int):	
  Int	
  ={	
  
	
  	
  var	
  result	
  =	
  0;	
  
	
  	
  for(n	
  <-­‐	
  1	
  to	
  value)	
  {	
  
	
  	
  	
  	
  result	
  =	
  result	
  +	
  n;	
  
	
  	
  }	
  
	
  	
  return	
  result;	
  
}	
  	
  	
  	
  
!
sowa(10)	
  
//>	
  res4:	
  Int	
  =	
  55
Copyright © 2014 TIS Inc. All rights reserved. 6
脱Javaライク
varはやめよう。	
  
forループもやめよう。	
  
再帰にしよう。
①終了条件 ②自分呼出 ③計算
Copyright © 2014 TIS Inc. All rights reserved. 7
再帰にしよう:ステップ①
def	
  sowa(value:	
  Int)	
  :Int	
  =	
  
	
  	
  if(value	
  ==	
  0)	
  value	
  
	
  	
  else	
  value	
  +	
  sowa(value	
  -­‐	
  1)
①終了条件 ②自分呼出 ③計算
計算対象の数値が0に
なったとき
Copyright © 2014 TIS Inc. All rights reserved. 8
再帰にしよう:ステップ②
def	
  sowa(value:	
  Int)	
  :Int	
  =	
  
	
  	
  if(value	
  ==	
  0)	
  value	
  
	
  	
  else	
  value	
  +	
  sowa(value	
  -­‐	
  1)
①終了条件 ②自分呼出 ③計算
自分()
Copyright © 2014 TIS Inc. All rights reserved. 9
再帰にしよう:ステップ③
def	
  sowa(value:	
  Int)	
  :Int	
  =	
  
	
  	
  if(value	
  ==	
  0)	
  value	
  
	
  	
  else	
  value	
  +	
  sowa(value	
  -­‐	
  1)
①終了条件 ②自分呼出 ③計算
対象値 + 自分()
Copyright © 2014 TIS Inc. All rights reserved. 10
再帰にしよう:実行1
def	
  sowa(value:	
  Int)	
  :Int	
  =	
  
	
  	
  if(value	
  ==	
  0)	
  value	
  
	
  	
  else	
  value	
  +	
  sowa(value	
  -­‐	
  1)
①終了条件 ②自分呼出 ③計算
sowa(10)	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
//>	
  res6:	
  Int	
  =	
  55	
  
Copyright © 2014 TIS Inc. All rights reserved. 11
再帰にしよう:実行2
def	
  sowa(value:	
  Int)	
  :Int	
  =	
  
	
  	
  if(value	
  ==	
  0)	
  value	
  
	
  	
  else	
  value	
  +	
  sowa(value	
  -­‐	
  1)
sowa(100000)	
  
//>	
  java.lang.StackOverflowError	
  
//|	
  	
   at	
  Demo$$anonfun$main$1.sowa$1(Demo.scala:64)	
  
//|	
  	
   at	
  Demo$$anonfun$main$1.sowa$1(Demo.scala:64)	
  
//|	
  	
   at	
  Demo$$anonfun$main$1.sowa$1(Demo.scala:64)
①終了条件 ②自分呼出 ③計算
Copyright © 2014 TIS Inc. All rights reserved. 12
スタックオーバーフロー!?
スタックのサイズを大きくする? (-Xss)	
!
 スタックの消費量を減らそう!
Copyright © 2014 TIS Inc. All rights reserved. 13
スタックオーバーフロー対策
末尾再帰で最適化	
!
!
!
!
自分を呼び出したあとに計算(足し算)するのではなく、	
計算したものを引数として、その結果を蓄積する。	
!
戻ってきたあとに計算がなく、呼出し元に戻るだけ。
def	
  sowa(value:	
  Int)	
  :Int	
  =	
  
	
  	
  if(value	
  ==	
  0)	
  value	
  
	
  	
  else	
  value	
  +	
  sowa(value	
  -­‐	
  1)
Copyright © 2014 TIS Inc. All rights reserved. 14
末尾再帰
アキュムレータ
(accumulator)
自分を呼び出したあとに計算(足し算)するのではなく、	
計算したものを引数として、その結果を蓄積する。
+	
  3	
  =
+	
  2	
  =
+	
  1	
  =
Copyright © 2014 TIS Inc. All rights reserved. 15
末尾再帰
アキュムレータ
(accumulator)
自分を呼び出したあとに計算(足し算)するのではなく、	
計算したものを引数として、その結果を蓄積する。
①終了条件 ②自分呼出 ③アキュムレータ	
  
 	
  による計算
Copyright © 2014 TIS Inc. All rights reserved. 16
末尾再帰にしよう:ステップ①
def sowa(value: Int, acc: Int = 0):Int =	
if(value == 0) acc	
else sowa(value - 1, value + acc)
計算対象の数値が0に
なったとき
①終了条件 ②自分呼出 ③アキュムレータ	
  
 	
  による計算
Copyright © 2014 TIS Inc. All rights reserved. 17
末尾再帰にしよう:ステップ②
def sowa(value: Int, acc: Int = 0):Int =	
if(value == 0) acc	
else sowa(value - 1, value + acc)
自分()
①終了条件 ②自分呼出 ③アキュムレータ	
  
 	
  による計算
Copyright © 2014 TIS Inc. All rights reserved. 18
末尾再帰にしよう:ステップ③
def sowa(value: Int, acc: Int = 0):Int =	
if(value == 0) acc	
else sowa(value - 1, value + acc)
対象値 + アキュム	
  
      レータ
①終了条件 ②自分呼出 ③アキュムレータ	
  
 	
  による計算
Copyright © 2014 TIS Inc. All rights reserved. 19
末尾再帰にしよう:実行
def sowa(value: Int, acc: Int = 0):Int =	
if(value == 0) acc	
else sowa(value - 1, value + acc)
sowa(100000)	
  
//>	
  res4:	
  Long	
  =	
  705082704
①終了条件 ②自分呼出 ③アキュムレータ	
  
 	
  による計算
Copyright © 2014 TIS Inc. All rights reserved. 20
逆アセンブル
public	
  final	
  int	
  sowa(int);	
  
	
  Code:	
  
	
  	
  	
  	
  0:	
  iload_1	
  
	
  	
  	
  	
  1:	
  iconst_0	
  
	
  	
  	
  	
  2:	
  if_icmpne	
  	
  	
  	
  	
  9	
  
	
  	
  	
  	
  5:	
  iload_1	
  
	
  	
  	
  	
  6:	
  goto	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  18	
  
	
  	
  	
  	
  9:	
  iload_1	
  
	
  	
  	
  10:	
  aload_0	
  
	
  	
  	
  11:	
  iload_1	
  
	
  	
  	
  12:	
  iconst_1	
  
	
  	
  	
  13:	
  isub	
  
	
  	
  	
  14:	
  invokevirtual	
  #101	
  
	
  	
  	
  	
  	
  	
  	
  //	
  Method	
  sowa2:(I)I	
  
	
  	
  	
  17:	
  iadd	
  
	
  	
  	
  18:	
  ireturn
public	
  final	
  int	
  sowa(int,	
  int);	
  
	
  Code:	
  
	
  	
  	
  	
  0:	
  iload_1	
  
	
  	
  	
  	
  1:	
  iconst_0	
  
	
  	
  	
  	
  2:	
  if_icmpne	
  	
  	
  	
  	
  7	
  
	
  	
  	
  	
  5:	
  iload_2	
  
	
  	
  	
  	
  6:	
  ireturn	
  
	
  	
  	
  	
  7:	
  iload_1	
  
	
  	
  	
  	
  8:	
  iconst_1	
  
	
  	
  	
  	
  9:	
  isub	
  
	
  	
  	
  10:	
  iload_1	
  
	
  	
  	
  11:	
  iload_2	
  
	
  	
  	
  12:	
  iadd	
  
	
  	
  	
  13:	
  istore_2	
  
	
  	
  	
  14:	
  istore_1	
  
	
  	
  	
  15:	
  goto	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  0
ただの再帰 末尾再帰
Copyright © 2014 TIS Inc. All rights reserved. 21
逆コンパイル
public final int sowa(int value) {	
return value != 0 ? value + sowa(value - 1) : value;	
}
def	
  sowa(value:	
  Int)	
  :Int	
  =	
  
	
  	
  if(value	
  ==	
  0)	
  value	
  
	
  	
  else	
  value	
  +	
  sowa(value	
  -­‐	
  1)
ただの再帰
Copyright © 2014 TIS Inc. All rights reserved. 22
逆コンパイル
public final int sowa(int value, int acc) {	
do {	
if (value == 0)	
return acc;	
acc = value + acc;	
value = value - 1;	
} while (true);	
}
def	
  sowa(value:	
  Int,	
  acc:	
  Int	
  =	
  0):Int	
  =	
  
	
  	
  if(value	
  ==	
  0)	
  acc	
  
	
  	
  else	
  sowa(value	
  -­‐	
  1,	
  value	
  +	
  acc)
最適
化!!
末尾再帰
Copyright © 2014 TIS Inc. All rights reserved. 23
tailrecアノテーション
末尾再帰になっていないメソッドの検出
import	
  scala.annotation.tailrec	
  
@tailrec	
  
final	
  def	
  sowa(value:	
  Int):	
  Int	
  =	
  
	
  	
  if	
  (value	
  ==	
  0)	
  value	
  
	
  	
  else	
  value	
  +	
  sowa(value	
  -­‐	
  1)
could	
  not	
  optimize	
  @tailrec	
  annotated	
  method	
  sowa:	
  
it	
  contains	
  a	
  recursive	
  call	
  not	
  in	
  tail	
  position
Copyright © 2014 TIS Inc. All rights reserved. 24
上書き禁止
@tailrec	
  
def	
  sowa(value:	
  Int,	
  acc:	
  Int	
  =	
  0):	
  Int	
  =	
  
	
  	
  if	
  (value	
  ==	
  0)	
  acc	
  
	
  	
  else	
  sowa(value	
  -­‐	
  1,	
  value	
  +	
  acc)
	
  @tailrec	
  
	
  	
  final	
  def	
  sowa(value:	
  Int,…
could	
  not	
  optimize	
  @tailrec	
  annotated	
  method	
  
sowa:	
  it	
  is	
  neither	
  private	
  nor	
  final	
  so	
  can	
  be	
  
overridden
overrideしてメソッドを変更出来ないようにfinalにする
privateにするか	
  
ローカルメソッドにしてもOK
Copyright © 2014 TIS Inc. All rights reserved. 25
総和
def	
  sowa(value:	
  Int)	
  :Int	
  =	
  
	
  	
  if(value	
  ==	
  0)	
  value	
  
	
  	
  else	
  value	
  +	
  sowa(value	
  -­‐	
  1)
ノーアキュム
@tailrec	
final	
  def	
  sowa(value:	
  Int,	
  acc:	
  Int	
  =	
  0):	
  Int	
  =	
  
	
  	
  if	
  (value	
  ==	
  0)	
  acc	
  
	
  	
  else	
  sowa(value	
  -­‐	
  1,	
  value	
  +	
  acc)
アキュム
Copyright © 2014 TIS Inc. All rights reserved. 26
!(階乗)
def	
  factorial(value:	
  Int):	
  Int	
  =	
  
	
  	
  if	
  (value	
  ==	
  0)	
  1	
  
	
  	
  else	
  value	
  *	
  factorial(value	
  -­‐	
  1)
@tailrec	
final def factorial(value: Int, acc: Long): Long =	
if (value == 0) acc	
else factorial(value - 1, value * acc)
ノーアキュム
アキュム
Copyright © 2014 TIS Inc. All rights reserved. 27
(おまけ)関数(計算式)を引数に
def calculate[A](value: Int, acc: A, func: (Int, A) => A): A = {	
def calculate(value: Int, acc: A): A =	
if (value == 0) acc	
else calculate(value - 1, func(value, acc))	
calculate(value, acc)	
}	
!
def factorial(value: Int) =	
calculate(value, 1L, (v: Int, acc: Long) => v * acc)	
!
def sowa(value: Int) =	
calculate(value, 0, (v: Int, acc: Int) => v + acc)	
計算(たすか	
  かけるか)
型(Int	
  か	
  Longか)
階乗
総和
Copyright © 2014 TIS Inc. All rights reserved. 28
まとめ:脱Javaライクの第一歩
再帰で関数型プログラミング	
  
アキュムレータで末尾再帰	
  
@tailrecで末尾かチェック	
  
!
注)	
  
間接的な再帰は最適化されません。
Copyright © 2014 TIS Inc. All rights reserved. 29
よくわからなかった、という方は	
  
スライドの最初に再帰してくださ
い。(コップ本より)
まとめ:脱Javaライクの第一歩
THANK YOU

Weitere ähnliche Inhalte

Was ist angesagt?

開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用Jiro Hiraiwa
 
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介Daisuke Ikeda
 
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談光平 八代
 
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介光平 八代
 
可用性を突き詰めたリアクティブシステム
可用性を突き詰めたリアクティブシステム可用性を突き詰めたリアクティブシステム
可用性を突き詰めたリアクティブシステムTIS Inc.
 
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現softlayerjp
 
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)Hinemos
 
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)Hinemos
 
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏Daisuke Ikeda
 
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)Daisuke Ikeda
 
Spring I/O 2017 報告 ThymeleafのWebFlux対応
Spring I/O 2017 報告 ThymeleafのWebFlux対応Spring I/O 2017 報告 ThymeleafのWebFlux対応
Spring I/O 2017 報告 ThymeleafのWebFlux対応Takuya Iwatsuka
 
AZAREA-Clusterセミナー(クラウドEXPO2013春)
AZAREA-Clusterセミナー(クラウドEXPO2013春)AZAREA-Clusterセミナー(クラウドEXPO2013春)
AZAREA-Clusterセミナー(クラウドEXPO2013春)AzareaCluster
 
20210427_Introducing_X-TechJAWS
20210427_Introducing_X-TechJAWS20210427_Introducing_X-TechJAWS
20210427_Introducing_X-TechJAWSTyphon 666
 
バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016AzareaCluster
 
170311 JAWS days 2017 fintech
170311 JAWS days 2017 fintech170311 JAWS days 2017 fintech
170311 JAWS days 2017 fintechToshihide Atsumi
 
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策エクイニクス・ジャパン
 
アメーバブログを支えるデータセンターとインフラ技術
アメーバブログを支えるデータセンターとインフラ技術 アメーバブログを支えるデータセンターとインフラ技術
アメーバブログを支えるデータセンターとインフラ技術 Hiroki NAKASHIMA
 
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザエクイニクス・ジャパン
 

Was ist angesagt? (20)

開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
開発組織を急成長させる AWS 〜 Opt Technologies の歩みと AWS 活用
 
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
第8回oss運用管理勉強会 Zabbix入門&Zabbix3.0先取り紹介
 
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
Ansible・ServerspecベースのOSS開発のCIの成功・失敗談
 
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
Ansible・Serverspecベースの自動化フレームワークSHIFT wareの紹介
 
可用性を突き詰めたリアクティブシステム
可用性を突き詰めたリアクティブシステム可用性を突き詰めたリアクティブシステム
可用性を突き詰めたリアクティブシステム
 
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
SIOS iQ:機械学習 I T O A VMware仮想環境の性能問題の原因分析 迅速な問題解決と未然防止を実現
 
Spring I/O 2015 報告
Spring I/O 2015 報告Spring I/O 2015 報告
Spring I/O 2015 報告
 
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
AWS Summit Tokyo 2015_NTTデータセッション(後半:AWSを使ったシステム運用ノウハウ)
 
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
AWS Summit Tokyo 2015_NTTデータセッション(前半:クラウドを活用したオムニチャネル基盤構築)
 
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
OSC 2020 Fukuoka IT運用自動化を支援する「運用レコメンドプラットフォーム」実現の舞台裏
 
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
OSC2018Tokyo/Fall 自律的運用に向けた第一歩(OpsBear取り組み紹介)
 
Spring I/O 2017 報告 ThymeleafのWebFlux対応
Spring I/O 2017 報告 ThymeleafのWebFlux対応Spring I/O 2017 報告 ThymeleafのWebFlux対応
Spring I/O 2017 報告 ThymeleafのWebFlux対応
 
AZAREA-Clusterセミナー(クラウドEXPO2013春)
AZAREA-Clusterセミナー(クラウドEXPO2013春)AZAREA-Clusterセミナー(クラウドEXPO2013春)
AZAREA-Clusterセミナー(クラウドEXPO2013春)
 
20210427_Introducing_X-TechJAWS
20210427_Introducing_X-TechJAWS20210427_Introducing_X-TechJAWS
20210427_Introducing_X-TechJAWS
 
バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016バッチソリューションAzarea cluster 2016
バッチソリューションAzarea cluster 2016
 
170311 JAWS days 2017 fintech
170311 JAWS days 2017 fintech170311 JAWS days 2017 fintech
170311 JAWS days 2017 fintech
 
OpenStack環境の継続的インテグレーション
OpenStack環境の継続的インテグレーションOpenStack環境の継続的インテグレーション
OpenStack環境の継続的インテグレーション
 
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
ぜんぜんスマートじゃないプライベートクラウドの現実 - 運用担当者が苦労する4つの問題と3つの救済策
 
アメーバブログを支えるデータセンターとインフラ技術
アメーバブログを支えるデータセンターとインフラ技術 アメーバブログを支えるデータセンターとインフラ技術
アメーバブログを支えるデータセンターとインフラ技術
 
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
知って得する!パブリッククラウドをオンプレミスのように使う裏ワザ
 

Andere mochten auch

リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiリアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiYuta Okamoto
 
実戦でのScala LT 2015.2.21
実戦でのScala LT 2015.2.21実戦でのScala LT 2015.2.21
実戦でのScala LT 2015.2.21Junichi Okamura
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaKazuhiro Sera
 
Reactive extensions入門v0.1
Reactive extensions入門v0.1Reactive extensions入門v0.1
Reactive extensions入門v0.1一希 大田
 
Scala@SmartNews_20150221
Scala@SmartNews_20150221Scala@SmartNews_20150221
Scala@SmartNews_20150221Shigekazu Takei
 
Scala@SmartNews AdFrontend を Scala で書いた話
Scala@SmartNews AdFrontend を Scala で書いた話Scala@SmartNews AdFrontend を Scala で書いた話
Scala@SmartNews AdFrontend を Scala で書いた話Keiji Muraishi
 
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscalaビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscalatakezoe
 
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話LINE Corporation
 
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-torisoup
 
Reactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-JavaReactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-JavaKasun Indrasiri
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 

Andere mochten auch (12)

リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiリアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
 
実戦でのScala LT 2015.2.21
実戦でのScala LT 2015.2.21実戦でのScala LT 2015.2.21
実戦でのScala LT 2015.2.21
 
Rx入門
Rx入門Rx入門
Rx入門
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscala
 
Reactive extensions入門v0.1
Reactive extensions入門v0.1Reactive extensions入門v0.1
Reactive extensions入門v0.1
 
Scala@SmartNews_20150221
Scala@SmartNews_20150221Scala@SmartNews_20150221
Scala@SmartNews_20150221
 
Scala@SmartNews AdFrontend を Scala で書いた話
Scala@SmartNews AdFrontend を Scala で書いた話Scala@SmartNews AdFrontend を Scala で書いた話
Scala@SmartNews AdFrontend を Scala で書いた話
 
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscalaビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
 
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
Akka ActorとAMQPでLINEのメッセージングパイプラインをリプレースした話
 
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-
 
Reactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-JavaReactive Programming in Java 8 with Rx-Java
Reactive Programming in Java 8 with Rx-Java
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 

Ähnlich wie 再帰で脱Javaライク

インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギインメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギMasaki Yamakawa
 
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸Takahiro Iwase
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由Ransui Iso
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)Shin-ya Koga
 
SwiftでRiemann球面を扱う
SwiftでRiemann球面を扱うSwiftでRiemann球面を扱う
SwiftでRiemann球面を扱うhayato iida
 
Arduinoでプログラミングに触れてみよう 続編
Arduinoでプログラミングに触れてみよう 続編Arduinoでプログラミングに触れてみよう 続編
Arduinoでプログラミングに触れてみよう 続編Hiromu Yakura
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門Makoto Fukuhara
 
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方Mayumi Emori
 
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミングNet Penguin
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-Yossy Taka
 

Ähnlich wie 再帰で脱Javaライク (20)

PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5
 
インメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギインメモリーで超高速処理を実現する場合のカギ
インメモリーで超高速処理を実現する場合のカギ
 
Aerospike deep dive LDTs
Aerospike deep dive LDTsAerospike deep dive LDTs
Aerospike deep dive LDTs
 
20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸20120317 IT系勉強会 in 神戸
20120317 IT系勉強会 in 神戸
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
 
SwiftでRiemann球面を扱う
SwiftでRiemann球面を扱うSwiftでRiemann球面を扱う
SwiftでRiemann球面を扱う
 
Arduinoでプログラミングに触れてみよう 続編
Arduinoでプログラミングに触れてみよう 続編Arduinoでプログラミングに触れてみよう 続編
Arduinoでプログラミングに触れてみよう 続編
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
大江戸Ruby会議01 "mission critical"なシステムでも使えるThreadの作り方
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-
Javascript入門-デジタル時計を作りながらJavaScriptを学ぼう-
 

Mehr von TIS Inc.

AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現TIS Inc.
 
Reactive Systems that focus on High Availability with Lerna
Reactive Systems that focus on High Availability with LernaReactive Systems that focus on High Availability with Lerna
Reactive Systems that focus on High Availability with LernaTIS Inc.
 
Starting Reactive Systems with Lerna #reactive_shinjuku
Starting Reactive Systems with Lerna #reactive_shinjukuStarting Reactive Systems with Lerna #reactive_shinjuku
Starting Reactive Systems with Lerna #reactive_shinjukuTIS Inc.
 
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜TIS Inc.
 
Akkaの並行性
Akkaの並行性Akkaの並行性
Akkaの並行性TIS Inc.
 
JavaからAkkaハンズオン
JavaからAkkaハンズオンJavaからAkkaハンズオン
JavaからAkkaハンズオンTIS Inc.
 
Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018TIS Inc.
 
Preparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuriPreparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuriTIS Inc.
 
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
Akkaで実現するステートフルでスケーラブルなアーキテクチャAkkaで実現するステートフルでスケーラブルなアーキテクチャ
Akkaで実現するステートフルでスケーラブルなアーキテクチャTIS Inc.
 
akka-doc-ja
akka-doc-jaakka-doc-ja
akka-doc-jaTIS Inc.
 
Effective Akka読書会2
Effective Akka読書会2Effective Akka読書会2
Effective Akka読書会2TIS Inc.
 
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)TIS Inc.
 
甲賀流Jenkins活用術
甲賀流Jenkins活用術甲賀流Jenkins活用術
甲賀流Jenkins活用術TIS Inc.
 

Mehr von TIS Inc. (13)

AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
AWSマネージドサービスとOSSによるミッションクリティカルなシステムの実現
 
Reactive Systems that focus on High Availability with Lerna
Reactive Systems that focus on High Availability with LernaReactive Systems that focus on High Availability with Lerna
Reactive Systems that focus on High Availability with Lerna
 
Starting Reactive Systems with Lerna #reactive_shinjuku
Starting Reactive Systems with Lerna #reactive_shinjukuStarting Reactive Systems with Lerna #reactive_shinjuku
Starting Reactive Systems with Lerna #reactive_shinjuku
 
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
EventStormingワークショップ 〜かつてない図書館をモデリングしてみよう〜
 
Akkaの並行性
Akkaの並行性Akkaの並行性
Akkaの並行性
 
JavaからAkkaハンズオン
JavaからAkkaハンズオンJavaからAkkaハンズオン
JavaからAkkaハンズオン
 
Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018Akka in Action workshop #ScalaMatsuri 2018
Akka in Action workshop #ScalaMatsuri 2018
 
Preparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuriPreparing for distributed system failures using akka #ScalaMatsuri
Preparing for distributed system failures using akka #ScalaMatsuri
 
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
Akkaで実現するステートフルでスケーラブルなアーキテクチャAkkaで実現するステートフルでスケーラブルなアーキテクチャ
Akkaで実現するステートフルでスケーラブルなアーキテクチャ
 
akka-doc-ja
akka-doc-jaakka-doc-ja
akka-doc-ja
 
Effective Akka読書会2
Effective Akka読書会2Effective Akka読書会2
Effective Akka読書会2
 
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
 
甲賀流Jenkins活用術
甲賀流Jenkins活用術甲賀流Jenkins活用術
甲賀流Jenkins活用術
 

再帰で脱Javaライク

  • 1. Copyright © 2014 TIS Inc. All rights reserved. 再帰で   脱Javaライク 2015.2.21 TIS株式会社   前出祐吾
  • 2. Copyright © 2014 TIS Inc. All rights reserved. 2 自己紹介 TIS株式会社 戦略技術センター! 社内向けエンジニア基盤の整備
       ▶ Scalaの活用検証! 甲賀忍者! 東京デビュー(先月)! @yugolf
  • 3. Copyright © 2014 TIS Inc. All rights reserved. 3 Scalaってどうなの? コード量が半分くらいに!   ! とはいえ、Scalaって難しいんじゃないの?   ! 大丈夫、Javaのライブラリ呼べるし、Javaライクにも書ける し。   (その場合、コード量は半分にならないけど。。)   ! ん!?
  • 4. Copyright © 2014 TIS Inc. All rights reserved. 4 脱Javaライクしてファ ンクショナルなプロ グラマーになるんです。  
  • 5. Copyright © 2014 TIS Inc. All rights reserved. 5 Javaライクってなんですの? 例:総和 1からnまでを全部足す。   ! (めいっ   ぱい、   Javaっぽ   く足す)   def  sowa(value:  Int):  Int  ={      var  result  =  0;      for(n  <-­‐  1  to  value)  {          result  =  result  +  n;      }      return  result;   }         ! sowa(10)   //>  res4:  Int  =  55
  • 6. Copyright © 2014 TIS Inc. All rights reserved. 6 脱Javaライク varはやめよう。   forループもやめよう。   再帰にしよう。 ①終了条件 ②自分呼出 ③計算
  • 7. Copyright © 2014 TIS Inc. All rights reserved. 7 再帰にしよう:ステップ① def  sowa(value:  Int)  :Int  =      if(value  ==  0)  value      else  value  +  sowa(value  -­‐  1) ①終了条件 ②自分呼出 ③計算 計算対象の数値が0に なったとき
  • 8. Copyright © 2014 TIS Inc. All rights reserved. 8 再帰にしよう:ステップ② def  sowa(value:  Int)  :Int  =      if(value  ==  0)  value      else  value  +  sowa(value  -­‐  1) ①終了条件 ②自分呼出 ③計算 自分()
  • 9. Copyright © 2014 TIS Inc. All rights reserved. 9 再帰にしよう:ステップ③ def  sowa(value:  Int)  :Int  =      if(value  ==  0)  value      else  value  +  sowa(value  -­‐  1) ①終了条件 ②自分呼出 ③計算 対象値 + 自分()
  • 10. Copyright © 2014 TIS Inc. All rights reserved. 10 再帰にしよう:実行1 def  sowa(value:  Int)  :Int  =      if(value  ==  0)  value      else  value  +  sowa(value  -­‐  1) ①終了条件 ②自分呼出 ③計算 sowa(10)                           //>  res6:  Int  =  55  
  • 11. Copyright © 2014 TIS Inc. All rights reserved. 11 再帰にしよう:実行2 def  sowa(value:  Int)  :Int  =      if(value  ==  0)  value      else  value  +  sowa(value  -­‐  1) sowa(100000)   //>  java.lang.StackOverflowError   //|     at  Demo$$anonfun$main$1.sowa$1(Demo.scala:64)   //|     at  Demo$$anonfun$main$1.sowa$1(Demo.scala:64)   //|     at  Demo$$anonfun$main$1.sowa$1(Demo.scala:64) ①終了条件 ②自分呼出 ③計算
  • 12. Copyright © 2014 TIS Inc. All rights reserved. 12 スタックオーバーフロー!? スタックのサイズを大きくする? (-Xss) !  スタックの消費量を減らそう!
  • 13. Copyright © 2014 TIS Inc. All rights reserved. 13 スタックオーバーフロー対策 末尾再帰で最適化 ! ! ! ! 自分を呼び出したあとに計算(足し算)するのではなく、 計算したものを引数として、その結果を蓄積する。 ! 戻ってきたあとに計算がなく、呼出し元に戻るだけ。 def  sowa(value:  Int)  :Int  =      if(value  ==  0)  value      else  value  +  sowa(value  -­‐  1)
  • 14. Copyright © 2014 TIS Inc. All rights reserved. 14 末尾再帰 アキュムレータ (accumulator) 自分を呼び出したあとに計算(足し算)するのではなく、 計算したものを引数として、その結果を蓄積する。 +  3  = +  2  = +  1  =
  • 15. Copyright © 2014 TIS Inc. All rights reserved. 15 末尾再帰 アキュムレータ (accumulator) 自分を呼び出したあとに計算(足し算)するのではなく、 計算したものを引数として、その結果を蓄積する。 ①終了条件 ②自分呼出 ③アキュムレータ      による計算
  • 16. Copyright © 2014 TIS Inc. All rights reserved. 16 末尾再帰にしよう:ステップ① def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) 計算対象の数値が0に なったとき ①終了条件 ②自分呼出 ③アキュムレータ      による計算
  • 17. Copyright © 2014 TIS Inc. All rights reserved. 17 末尾再帰にしよう:ステップ② def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) 自分() ①終了条件 ②自分呼出 ③アキュムレータ      による計算
  • 18. Copyright © 2014 TIS Inc. All rights reserved. 18 末尾再帰にしよう:ステップ③ def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) 対象値 + アキュム         レータ ①終了条件 ②自分呼出 ③アキュムレータ      による計算
  • 19. Copyright © 2014 TIS Inc. All rights reserved. 19 末尾再帰にしよう:実行 def sowa(value: Int, acc: Int = 0):Int = if(value == 0) acc else sowa(value - 1, value + acc) sowa(100000)   //>  res4:  Long  =  705082704 ①終了条件 ②自分呼出 ③アキュムレータ      による計算
  • 20. Copyright © 2014 TIS Inc. All rights reserved. 20 逆アセンブル public  final  int  sowa(int);    Code:          0:  iload_1          1:  iconst_0          2:  if_icmpne          9          5:  iload_1          6:  goto                    18          9:  iload_1        10:  aload_0        11:  iload_1        12:  iconst_1        13:  isub        14:  invokevirtual  #101                //  Method  sowa2:(I)I        17:  iadd        18:  ireturn public  final  int  sowa(int,  int);    Code:          0:  iload_1          1:  iconst_0          2:  if_icmpne          7          5:  iload_2          6:  ireturn          7:  iload_1          8:  iconst_1          9:  isub        10:  iload_1        11:  iload_2        12:  iadd        13:  istore_2        14:  istore_1        15:  goto                    0 ただの再帰 末尾再帰
  • 21. Copyright © 2014 TIS Inc. All rights reserved. 21 逆コンパイル public final int sowa(int value) { return value != 0 ? value + sowa(value - 1) : value; } def  sowa(value:  Int)  :Int  =      if(value  ==  0)  value      else  value  +  sowa(value  -­‐  1) ただの再帰
  • 22. Copyright © 2014 TIS Inc. All rights reserved. 22 逆コンパイル public final int sowa(int value, int acc) { do { if (value == 0) return acc; acc = value + acc; value = value - 1; } while (true); } def  sowa(value:  Int,  acc:  Int  =  0):Int  =      if(value  ==  0)  acc      else  sowa(value  -­‐  1,  value  +  acc) 最適 化!! 末尾再帰
  • 23. Copyright © 2014 TIS Inc. All rights reserved. 23 tailrecアノテーション 末尾再帰になっていないメソッドの検出 import  scala.annotation.tailrec   @tailrec   final  def  sowa(value:  Int):  Int  =      if  (value  ==  0)  value      else  value  +  sowa(value  -­‐  1) could  not  optimize  @tailrec  annotated  method  sowa:   it  contains  a  recursive  call  not  in  tail  position
  • 24. Copyright © 2014 TIS Inc. All rights reserved. 24 上書き禁止 @tailrec   def  sowa(value:  Int,  acc:  Int  =  0):  Int  =      if  (value  ==  0)  acc      else  sowa(value  -­‐  1,  value  +  acc)  @tailrec      final  def  sowa(value:  Int,… could  not  optimize  @tailrec  annotated  method   sowa:  it  is  neither  private  nor  final  so  can  be   overridden overrideしてメソッドを変更出来ないようにfinalにする privateにするか   ローカルメソッドにしてもOK
  • 25. Copyright © 2014 TIS Inc. All rights reserved. 25 総和 def  sowa(value:  Int)  :Int  =      if(value  ==  0)  value      else  value  +  sowa(value  -­‐  1) ノーアキュム @tailrec final  def  sowa(value:  Int,  acc:  Int  =  0):  Int  =      if  (value  ==  0)  acc      else  sowa(value  -­‐  1,  value  +  acc) アキュム
  • 26. Copyright © 2014 TIS Inc. All rights reserved. 26 !(階乗) def  factorial(value:  Int):  Int  =      if  (value  ==  0)  1      else  value  *  factorial(value  -­‐  1) @tailrec final def factorial(value: Int, acc: Long): Long = if (value == 0) acc else factorial(value - 1, value * acc) ノーアキュム アキュム
  • 27. Copyright © 2014 TIS Inc. All rights reserved. 27 (おまけ)関数(計算式)を引数に def calculate[A](value: Int, acc: A, func: (Int, A) => A): A = { def calculate(value: Int, acc: A): A = if (value == 0) acc else calculate(value - 1, func(value, acc)) calculate(value, acc) } ! def factorial(value: Int) = calculate(value, 1L, (v: Int, acc: Long) => v * acc) ! def sowa(value: Int) = calculate(value, 0, (v: Int, acc: Int) => v + acc) 計算(たすか  かけるか) 型(Int  か  Longか) 階乗 総和
  • 28. Copyright © 2014 TIS Inc. All rights reserved. 28 まとめ:脱Javaライクの第一歩 再帰で関数型プログラミング   アキュムレータで末尾再帰   @tailrecで末尾かチェック   ! 注)   間接的な再帰は最適化されません。
  • 29. Copyright © 2014 TIS Inc. All rights reserved. 29 よくわからなかった、という方は   スライドの最初に再帰してくださ い。(コップ本より) まとめ:脱Javaライクの第一歩