Guest User

Untitled

a guest
Oct 20th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.73 KB | None | 0 0
  1. /*
  2. * Copyright (c) 2017 Yuki Ono
  3. * Licensed under the MIT License.
  4. */
  5.  
  6. package func_basic
  7.  
  8. import scala.annotation.tailrec
  9.  
  10. object Main extends App {
  11. def proceduralSum(ns: List[Int]): Int = {
  12. var sum = 0
  13.  
  14. var i = 0
  15. while (i < ns.length) {
  16. sum += ns(i)
  17. i += 1
  18. }
  19.  
  20. return sum
  21. }
  22.  
  23. def recSum(ns: List[Int]): Int = ns match {
  24. case Nil => 0
  25. case n :: rest => n + recSum(rest)
  26. }
  27.  
  28. def tailRecSum(ns: List[Int]): Int = {
  29. @tailrec
  30. def loop(l: List[Int], acc: Int): Int = l match {
  31. case Nil => acc
  32. case n :: rest => loop(rest, n + acc)
  33. }
  34.  
  35. loop(ns, 0)
  36. }
  37.  
  38. def foldLeftSum(ns: List[Int]): Int = {
  39. ns.foldLeft(0)((b, a) => b + a)
  40. //ns.foldLeft(0)(_ + _)
  41. }
  42.  
  43. def foldRightSum(ns: List[Int]): Int = {
  44. ns.foldRight(0)((a, b) => a + b)
  45. // ns.foldRight(0)(_ + _)
  46. }
  47.  
  48. def reduceLeftSum(ns: List[Int]): Int = {
  49. ns.reduceLeft((b, a) => b + a)
  50. //ns.reduceLeft(_ + _)
  51. }
  52.  
  53. def reduceRightSum(ns: List[Int]): Int = {
  54. ns.reduceRight((a, b) => a + b)
  55. //ns.reduceRight(_ + _)
  56. }
  57.  
  58. def sumSum(ns: List[Int]): Int = {
  59. ns.sum
  60. }
  61.  
  62. val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  63. //val numbers = (1 to 10).toList
  64.  
  65. println("*** Sum ***")
  66. println(proceduralSum(numbers))
  67. println(recSum(numbers))
  68. println(tailRecSum(numbers))
  69. println(foldLeftSum(numbers))
  70. println(foldRightSum(numbers))
  71. println(reduceLeftSum(numbers))
  72. println(reduceRightSum(numbers))
  73. println(sumSum(numbers))
  74.  
  75.  
  76.  
  77. def proceduralFactorial(num: Int): Long = {
  78. require(num >= 0)
  79.  
  80. var fn = 1L
  81.  
  82. var i = 1
  83. while (i <= num) {
  84. fn *= i
  85. i += 1
  86. }
  87.  
  88. return fn
  89. }
  90.  
  91. def recFactorial(num: Int): Long = {
  92. require(num >= 0)
  93.  
  94. num match {
  95. case 0 => 1
  96. case n => n * recFactorial(n - 1)
  97. }
  98. }
  99.  
  100. def tailRecFactorial(num: Int): Long = {
  101. require(num >= 0)
  102.  
  103. @tailrec
  104. def loop(n: Long, acc: Long): Long = n match {
  105. case 0 => acc
  106. case _ => loop(n - 1, n * acc)
  107. }
  108.  
  109. loop(num, 1)
  110. }
  111.  
  112. def foldLeftFactorial(num: Int): Long = {
  113. require(num >= 0)
  114.  
  115. (1 to num).foldLeft(1L)((b, a) => b * a)
  116. //(1 to num).foldLeft(1L)(_ * _)
  117. }
  118.  
  119. def foldRightFactorial(num: Int): Long = {
  120. require(num >= 0)
  121.  
  122. (1 to num).foldRight(1L)((a, b) => a * b)
  123. }
  124.  
  125. println()
  126. println("*** Factorial ***");
  127. println(proceduralFactorial(10))
  128. println(recFactorial(10))
  129. println(tailRecFactorial(10))
  130. println(foldLeftFactorial(10))
  131. println(foldRightFactorial(10))
  132.  
  133.  
  134.  
  135. def proceduralFib(num: Int): Int = {
  136. if (num < 2)
  137. return num
  138.  
  139. var fib1 = 0
  140. var fib2 = 1
  141. var temp = 0
  142.  
  143. var i = 2
  144. while (i <= num) {
  145. temp = fib1
  146. fib1 = fib2
  147. fib2 = temp + fib2
  148.  
  149. i += 1
  150. }
  151.  
  152. return fib2
  153. }
  154.  
  155. def recFib(num: Int): Int = num match {
  156. case n if n < 2 => n
  157. case n => recFib(n - 1) + recFib(n - 2)
  158. }
  159.  
  160. def tailRecFib(num: Int): Int = {
  161. @tailrec
  162. def loop(n: Int, a: Int, b: Int): Int = n match {
  163. case 0 => a
  164. case n => loop(n - 1, b, (a + b))
  165. }
  166.  
  167. loop(num, 0, 1)
  168. }
  169.  
  170. def memoFib(num: Int): Int = {
  171. val memo = collection.mutable.Map[Int, Int]()
  172.  
  173. def fib(n: Int) = n match {
  174. case n if n < 2 => n
  175. case _ => memoFib(n - 1) + memoFib(n - 2)
  176. }
  177.  
  178. memo.get(num) match {
  179. case Some(res) => res
  180. case None => {
  181. val res = fib(num)
  182. memo(num) = res
  183. res
  184. }
  185. }
  186. }
  187.  
  188. println()
  189. println("*** Fibonacci ***")
  190. println(proceduralFib(10))
  191. println(recFib(10))
  192. println(tailRecFib(10))
  193. println(memoFib(10))
  194.  
  195.  
  196.  
  197. def proceduralX2(ns: List[Int]): List[Int] = {
  198. val buf = scala.collection.mutable.ListBuffer.empty[Int]
  199.  
  200. var i = 0;
  201. while (i < ns.length) {
  202. buf += ns(i) * 2
  203. i += 1
  204. }
  205.  
  206. return buf.toList
  207. }
  208.  
  209. def recX2(ns: List[Int]): List[Int] = ns match {
  210. case Nil => Nil
  211. case n :: rest => (n * 2) :: recX2(rest)
  212. }
  213.  
  214. def tailRecX2(ns: List[Int]): List[Int] = {
  215. @tailrec
  216. def loop(l: List[Int], acc: List[Int]): List[Int] = l match {
  217. case Nil => acc
  218. case n :: rest => loop(rest, (n * 2) :: acc)
  219. }
  220.  
  221. loop(ns, Nil).reverse
  222. }
  223.  
  224. def foldLeftX2(ns: List[Int]): List[Int] = {
  225. ns.foldLeft(List[Int]())((b, a) => (a * 2) :: b).reverse
  226. }
  227.  
  228. def foldRightX2(ns: List[Int]): List[Int] = {
  229. ns.foldRight(List[Int]())((a, b) => (a * 2) :: b)
  230. }
  231.  
  232. def mapX2(ns: List[Int]): List[Int] = {
  233. val x2 = (n: Int) => n * 2
  234. ns.map(x2)
  235.  
  236. //ns.map(n => n * 2)
  237. //ns.map(_ * 2)
  238. }
  239.  
  240. println()
  241. println("*** X2 ***")
  242. println(proceduralX2(numbers))
  243. println(recX2(numbers))
  244. println(tailRecX2(numbers))
  245. println(foldLeftX2(numbers))
  246. println(foldRightX2(numbers))
  247. println(mapX2(numbers))
  248.  
  249.  
  250.  
  251. def proceduralEven(ns: List[Int]): List[Int] = {
  252. val buf = scala.collection.mutable.ListBuffer.empty[Int]
  253.  
  254. var i = 0;
  255. while (i < ns.length) {
  256. if (ns(i) % 2 == 0)
  257. buf += ns(i)
  258.  
  259. i += 1
  260. }
  261.  
  262. return buf.toList
  263. }
  264.  
  265. def recEven(ns: List[Int]): List[Int] = ns match {
  266. case Nil => Nil
  267. case n :: rest => if (n % 2 == 0) n :: recEven(rest) else recEven(rest)
  268. }
  269.  
  270. def tailRecEven(ns: List[Int]): List[Int] = {
  271. def loop(l: List[Int], acc: List[Int]): List[Int] = l match {
  272. case Nil => acc
  273. case n :: rest => loop(rest, if (n % 2 == 0) n :: acc else acc)
  274. }
  275.  
  276. loop(ns, Nil).reverse
  277. }
  278.  
  279. def filterEven(ns: List[Int]): List[Int] = {
  280. val isEven = (n: Int) => n % 2 == 0
  281. ns.filter(isEven)
  282.  
  283. //ns.filter(n => n % 2 == 0)
  284. //ns.filter(_ % 2 == 0)
  285. }
  286.  
  287. println()
  288. println("*** Even ***")
  289. println(proceduralEven(numbers))
  290. println(recEven(numbers))
  291. println(tailRecEven(numbers))
  292. println(filterEven(numbers))
  293. }
Add Comment
Please, Sign In to add comment