質問するログイン新規登録

回答編集履歴

2

送りかなを修正

2019/01/30 09:40

投稿

退会済みユーザー
answer CHANGED
@@ -25,7 +25,7 @@
25
25
  ```
26
26
 
27
27
  ### 命令型から関数型へ
28
- 質問の意図は、Javaで書けるプログラムをScalaにしかっただけでしょうか。以下が望んでいる答えです。"()"の無限ループを避けるため正規表現を変更しました。せっかくなので、これをScalaの関数型プログラミングに変形します。
28
+ 質問の意図は、Javaで書けるプログラムをScalaにしかっただけでしょうか。以下が望んでいる答えです。"()"の無限ループを避けるため正規表現を変更しました。せっかくなので、これをScalaの関数型プログラミングに変形します。
29
29
 
30
30
  ```Scala
31
31
  def unParentheses(code:String):String = {

1

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

2019/01/30 09:40

投稿

退会済みユーザー
answer CHANGED
@@ -1,6 +1,6 @@
1
1
  **ワンライナー**
2
2
  ```Scala
3
- def unParentheses(s:String):String = if (s.isEmpty) s else if (s.head == '(' && s.last == ')') unParentheses(s.drop(1).dropRight(1)) else s
3
+ def unParentheses(s:String):String = if (!s.isEmpty && s.head == '(' && s.last == ')') unParentheses(s.drop(1).dropRight(1)) else s
4
4
  ```
5
5
  **パターンマッチ**
6
6
  ```Scala
@@ -21,5 +21,39 @@
21
21
  unParentheses("()")
22
22
  unParentheses("((ab(c)))")
23
23
  unParentheses("(ab(c))")
24
- unParentheses("a")
24
+ unParentheses("ab(c)")
25
+ ```
26
+
27
+ ### 命令型から関数型へ
28
+ 質問の意図は、Javaで書けるプログラムををScalaにしかっただけでしょうか。以下が望んでいる答えです。"()"の無限ループを避けるため正規表現を変更しました。せっかくなので、これをScalaの関数型プログラミングに変形します。
29
+
30
+ ```Scala
31
+ def unParentheses(code:String):String = {
32
+ var term = code.slice(0,code.length)
33
+ while(!term.isEmpty && term.head =='(' && term.last == ')'){
34
+ term = term.replaceAll("^\((.*)\)$", "$1")
35
+ }
36
+ term
37
+ }
38
+ ```
39
+
40
+ 上の命令型ロジックの構造を変えます。
41
+ - var term を削る。必要ないため。
42
+ - whileの代わりに末尾再帰にする。末尾再帰はwhileと実質的に同じです。
43
+
44
+ ```Scala
45
+ @scala.annotation.tailrec
46
+ def unParentheses(code:String):String = {
47
+ if (code.isEmpty || code.head !='(' || code.last != ')')
48
+ code
49
+ else
50
+ unParentheses(code.replaceAll("^\((.*)\)$", "$1"))
51
+ }
52
+ ```
53
+
54
+ この if else 構造を、波括弧をはずして一文にすると、ワンライナーになります。
55
+
56
+ ```Scala
57
+ @scala.annotation.tailrec
58
+ def unParentheses(code:String):String = if (code.isEmpty || code.head !='(' || code.last != ')') code else unParentheses(code.replaceAll("^\((.*)\)$", "$1"))
25
59
  ```