1. ysn

    Posted

    ysn
Changes in title
+最大値を求める
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,55 @@
+
+Swiftは、命令型プログラミングと関数型プログラミングをサポートしているマルチパラダイムプログラミング言語です。
+
+そこで、「最大値を求める」という関数を通して、命令型プログラミングと関数型プログラミングのアプローチの違いを紹介いたします。
+
+# 命令型プログラミングと関数型プログラミングの違い
+[関数型プログラミングの基礎 JavaScriptを使って学ぶ (amazon)](https://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%9F%BA%E7%A4%8E-JavaScript%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%AD%A6%E3%81%B6-%E7%AB%8B%E5%B7%9D%E5%AF%9F%E7%90%86/dp/4865940596)」から
+
+* 土台となっている数学モデルが異なる
+ * 命令型プログラミング = チューリング・マシン
+ * 関数型プログラミング = ラムダ計算
+* それぞれにおける計算の意味が異なる
+ * 命令型プログラミング = 命令(状態の変更)を実行すること
+ * 関数型プログラミング = 関数を呼び出して値を得ること
+ *
+
+# 命令型プログラミングによる最大値の導出
+
+最大値を格納する変数を用意し、forループ文で各要素を比較していく。
+
+```imprerative_maximum.swift
+func maximum<T>(_ arr: [T]) -> T where T: Comparable {
+ guard arr.isEmpty == false else { fatalError() }
+ var maximum = arr[0]
+ for i in arr.dropFirst() {
+ maximum = maximum > i ? maximum : i
+ }
+ return maximum;
+}
+```
+
+# 関数型プログラミングによる最大値の導出
+
+最大値を返すmax関数を再帰で呼び出していく。
+
+```functional_maximum.swift
+func maximum<T>(_ arr: [T]) -> T where T: Comparable {
+ switch arr.count {
+ case 0:
+ fatalError()
+ case 1:
+ return arr[0]
+ default:
+ return max(arr[0], maximum(Array(arr.dropFirst())))
+ }
+}
+```
+
+# 参考書籍
+[関数型プログラミングの基礎 JavaScriptを使って学ぶ](https://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%9F%BA%E7%A4%8E-JavaScript%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%AD%A6%E3%81%B6-%E7%AB%8B%E5%B7%9D%E5%AF%9F%E7%90%86/dp/4865940596) Amazon
+
+[すごいHaskellたのしく学ぼう!](https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854) Amazon
+
+# 関連Qiita
+[命令型プログラミングと関数型プログラミングによる単方向リスト](https://qiita.com/ysn551/items/c62be92937b86a91ccfd)