第8回付録 プログラム例 と REPLインタラクションの例

最小公倍数(LCM)と最大公約数(GCD または GCM)

ここでは gcm という関数名をつけておく。

def gcm(n:BigInt,m:BigInt):BigInt= {
	print(s"gcm($n,$m)") ;
	val x=n%m ;
	if( x ==0 ) m 
	else gcm(m, x) ;
}
def lcm(n:BigInt, m:BigInt)=
  n*m/gcm(n,m)	

gcmは、こうも書ける

def gcm(n:BigInt,m:BigInt):BigInt=
	if( m==0 ) n else gcm(m, n%m) 
 (参考)手続き的な(ひと世代前の)書き方
def gcm(n:BigInt,m:BigInt):BigInt= {
	var nn=n ; var mm=m
	while(mm!=0) {
		print(s"gcm_($nn,$mm)")
		val x=nn%mm
		nn=mm ; mm=x
	}	
	nn
}

再帰(関数の中から複数の再帰呼び出し)の例

def Q (len:Double) {
	if(len>5) {
		for(i <- 1 to 30) {
			forward(len) ; left(12)
			if(i%10==0) Q(len/2)
		}
	}
}
clear
setPenThickness(10)
for(i<-1 to 30) {
    if(i%10==0)
        setPenColor(color(random(256),random(256),random(256)))
    forward(10)
    left(12)
}
def y(len:Double) {
    if(len>20) {
        setPenThickness(len/3)
        forward(len)
        right(30) ; y(len*0.8)
        left(60)  ; y(len*0.8)
        right(30)     
        back(len)
    }
}
clear
y(100)

#

Welcome to Scala version 2.11.4 Server VM, Java 1.8.0_111).
Type in expressions to have theType :help for more information

scala> def hel(x:Any):String = hel: (x: Any)String

scala> hel(1)
res0: String = hello

scala> 960 % 81
res1: Int = 69
scala> 81 % 69
res2: Int = 12
scala> 69 % 12
res3: Int = 9
scala> 12 % 9
res4: Int = 3
scala> 9%3
res5: Int = 0

scala> def gcm(n:Long,m:Long):L
     | if( n%m ==0 ) m
     | else gcm(m, n%m)
     | }
gcm: (n: Long, m: Long)Long

scala> gcm(12,20)
res6: Long = 4
scala> gcm(960,81)
res7: Long = 3

scala> val x=30
x: Int = 30
scala> "x="+x
res8: String = x=30
scala> x+x+x
res9: Int = 90
scala> ""+x+x+x
res10: String = 303030
scala> ""+x
res11: String = 30

scala> def gcm(n:Long,m:Long):L
     | print("gcm("+n+","+m+")"
     | val x=n%m ;
     | if( x ==0 ) m
     | else gcm(m, x) ;
     | }
gcm: (n: Long, m: Long)Long

scala> gcm(20,12)
gcm(20,12)gcm(12,8)gcm(8,4)res14

scala> gcm(81,60)
gcm(81,60)gcm(60,21)gcm(21,18)gs13: Long = 3

scala> gcm(81,960)
gcm(81,960)gcm(960,81)gcm(81,69)gcm(12,9)gcm(9,3)res14: Long =

scala> 1+""
res15: String = 1
scala> ""+1
res16: String = 1
scala> 1+2
res17: Int = 3

scala> gcm(83472,9260)
gcm(83472,9260)gcm(9260,132)gcmm(20,12)gcm(12,8)gcm(8,4)res18:

scala> def gcm(n:BigInt,m:BigIn {
     | print("gcm("+n+","+m+")"
     | val x=n%m ;
     | if( x ==0 ) m
     | else gcm(m, x) ;
     | }
gcm: (n: BigInt, m: BigInt)BigI

scala>

scala> gcm(1289127941,22194128)gcm(1289127941,22194128)gcm(221517)gcm(1868517,1640441)gcm(1646)gcm(228076,43909)gcm(43909,851,1254)gcm(1254,1007)gcm(1007,2,19)res19: BigInt = 19

scala> gcm(1289127985238541,2234128)
<console>:1: error: integer numrge
       gcm(1289127985238541,2234128)

scala> gcm(128912741,22326341) gcm(128912741,22326341)gcm(2232036)gcm(17281036,5045305)gcm(50121)gcm(2145121,755063)gcm(7550gcm(634995,120068)gcm(120068,34655,16103)gcm(16103,2449)gcm(24m(1409,1040)gcm(1040,369)gcm(36302,67)gcm(67,34)gcm(34,33)gcm(: BigInt = 1

scala> 6%2
res21: Int = 0
scala> 6/2
res22: Int = 3

scala> 7/2
res23: Int = 3
scala> 7%2
res24: Int = 1