回答編集履歴

2

送りかなを修正

2019/01/30 09:40

投稿

退会済みユーザー
test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  ### 命令型から関数型へ
54
54
 
55
- 質問の意図は、Javaで書けるプログラムをScalaにしかっただけでしょうか。以下が望んでいる答えです。"()"の無限ループを避けるため正規表現を変更しました。せっかくなので、これをScalaの関数型プログラミングに変形します。
55
+ 質問の意図は、Javaで書けるプログラムをScalaにしかっただけでしょうか。以下が望んでいる答えです。"()"の無限ループを避けるため正規表現を変更しました。せっかくなので、これをScalaの関数型プログラミングに変形します。
56
56
 
57
57
 
58
58
 

1

先頭のワンライナーを変更。実行例を変更。「命令型から関数型へ」を追記

2019/01/30 09:40

投稿

退会済みユーザー
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ```Scala
4
4
 
5
- def unParentheses(s:String):String = if (s.isEmpty) s else if (s.head == '(' && s.last == ')') unParentheses(s.drop(1).dropRight(1)) else s
5
+ def unParentheses(s:String):String = if (!s.isEmpty && s.head == '(' && s.last == ')') unParentheses(s.drop(1).dropRight(1)) else s
6
6
 
7
7
  ```
8
8
 
@@ -44,6 +44,74 @@
44
44
 
45
45
  unParentheses("(ab(c))")
46
46
 
47
- unParentheses("a")
47
+ unParentheses("ab(c)")
48
48
 
49
49
  ```
50
+
51
+
52
+
53
+ ### 命令型から関数型へ
54
+
55
+ 質問の意図は、Javaで書けるプログラムををScalaにしかっただけでしょうか。以下が望んでいる答えです。"()"の無限ループを避けるため正規表現を変更しました。せっかくなので、これをScalaの関数型プログラミングに変形します。
56
+
57
+
58
+
59
+ ```Scala
60
+
61
+ def unParentheses(code:String):String = {
62
+
63
+ var term = code.slice(0,code.length)
64
+
65
+ while(!term.isEmpty && term.head =='(' && term.last == ')'){
66
+
67
+ term = term.replaceAll("^\((.*)\)$", "$1")
68
+
69
+ }
70
+
71
+ term
72
+
73
+ }
74
+
75
+ ```
76
+
77
+
78
+
79
+ 上の命令型ロジックの構造を変えます。
80
+
81
+ - var term を削る。必要ないため。
82
+
83
+ - whileの代わりに末尾再帰にする。末尾再帰はwhileと実質的に同じです。
84
+
85
+
86
+
87
+ ```Scala
88
+
89
+ @scala.annotation.tailrec
90
+
91
+ def unParentheses(code:String):String = {
92
+
93
+ if (code.isEmpty || code.head !='(' || code.last != ')')
94
+
95
+ code
96
+
97
+ else
98
+
99
+ unParentheses(code.replaceAll("^\((.*)\)$", "$1"))
100
+
101
+ }
102
+
103
+ ```
104
+
105
+
106
+
107
+ この if else 構造を、波括弧をはずして一文にすると、ワンライナーになります。
108
+
109
+
110
+
111
+ ```Scala
112
+
113
+ @scala.annotation.tailrec
114
+
115
+ def unParentheses(code:String):String = if (code.isEmpty || code.head !='(' || code.last != ')') code else unParentheses(code.replaceAll("^\((.*)\)$", "$1"))
116
+
117
+ ```