RubyとPythonの構文〜分岐〜

#はじめに
「Rubyしかできない奴はアルゴリズムがわからない馬鹿だ」というような記事を読んだり（どこで読んだか忘れました）
ペアプロでハッカソンしている中でアルゴリズム考えるの苦手という声をよく聞いたりします。

大学で取った**アルゴリズム論**（眠かった）が初めて活かせるかもしれない！と思ったのでこれから色々分解していきたいと思います。

まずは使える構文の整理をしてみました。

#この記事のゴール
・条件分岐の構文が使い分けられるようになる
・RubyとPythonのコードの違いがわかる

#そもそも構文とは？
プログラムの基本的な命令の書き方のこと。

プログラムは３つの動きしかしません。

```
・順次処理：上から順番に実行される。基本はこの動き。
・分岐処理：条件によって処理を変える。心理テストみたいな動き。
・反復処理：同じ処理を繰り返す。ほっとくと無限に続いてしまうから何かの条件と組み合わせる。
```
これらの書き方のルールが構文です！

ちなみに、変数、定数、代入なども構文と言われることがあります。

#条件分岐の構文
##if
設定された条件によって実行する処理を変えます。条件に合わなかった時の処理も設定できます。
図にするとこう↓
<img width="311" alt="スクリーンショット 2020-04-15 21.34.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156508/c86b64a6-561f-2038-3369-57fd7c8fce6d.png">


条件を複数設定することもできます。
<img width="582" alt="スクリーンショット 2020-04-15 19.20.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156508/e89dc9f5-575c-9442-8bba-b95ea22d6f0d.png">

###Rubyのif
**if - elsif・・・else - end** で記述します。

```ruby:if.rb
if a == b 
 puts "aとbは等しい"
elsif a > b
 puts "aが大きい"
else
 puts "bが大きい"
end
```

###Pythonのif
**if - elif・・・else** で記述します。

```python:if.py
if a == b: 
 print("aとbは等しい")
elif a > b:
 print("aが大きい")
else:
 print("bが大きい")
```
####ちなみに
[if-endを複数並べるよりもif-elsif-else-endで実装した方が処理速度が早い](https://qiita.com/miqa3893/items/650ff470d9fff2a9506c)らしいです。


##unless
設定された条件に合わなかった時に処理を実行します。ifの反対です。
<img width="217" alt="スクリーンショット 2020-04-15 21.35.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156508/42aa6dda-7e7d-e572-3099-1fa6317a374b.png">


###Rubyのunless
```ruby:unless.rb
unless a = b 
 puts "aとbは等しくない"
end
```
elseも使えますが、処理を2つに分岐させたい場合は **if-else** を使う方が好ましいです。
「〜ではない時」を条件にしたい場合は否定演算子（！）を使います。

```ruby:unlessOrIf.rb
unless a == b 
 puts "aとbは等しくない"
else
 puts "aとbは等しい"
end

#以下と同じ
if a != b
 puts "aとbは等しくない"
else
 puts "aとbは等しい"
end

#結局これでいい
if a == b
 puts "aとbは等しい"
else
 puts "aとbは等しくない"
end
```

elsifで複数の条件を設定することはできません。複雑な分岐になるときはif文を使いましょう。

####じゃあいつunlessを使うの？

1. 処理が一つで
2. 否定条件の方がわかりやすい時

にunlessを使います。

```ruby:unless.rb
unless year > 20 
 puts "お酒は買えません"
end
```

###Pythonのunless
ないです！！が、if notという書き方ができます。

```python:ifnot.rb
if not year > 20:
 print("お酒は買えません")
```
and,or,notの論理演算子を使って条件を設定できるみたいです。
詳しくは[こちら](https://note.nkmk.me/python-if-elif-else/)

##case（switch文）
何かの値によって複数の分岐をさせたい時はcaseがおすすめです。
ifだと条件式を分岐の回数分記述しないといけませんが、caseでは条件は1つで済むからです。
（Rubyカリキュラム「レビューアプリ」のinputの値によるメニューの分岐はcaseの方がシンプル！）
<img width="565" alt="スクリーンショット 2020-04-15 21.41.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156508/27152754-2da2-32d2-27b1-254ff26b4373.png">



###Rubyのcase
```ruby:case.rb
case a
when 1
 puts "aは1"
when 2
 puts "aは2"
else
 puts "なんでもないよ"
end
```
ifの条件に==を使用し、複数の分岐を設定する時と動きは一緒です。

比較する値を２つ以上設定することもできます。

```ruby:case.rb
case a
when 1,2
 puts "aは1か2"
when 3,4
 puts "aは3か4"
else
 puts "なんでもないよ"
end
```

###Pythonのcase
ないです！！！！公式ドキュメントによると、
>if... elif... elif... else の繰り返しで簡単に同じことができます。switch 文の構文に関する提案がいくつかありましたが、範囲判定をするべきか、あるいはどのようにするべきかについての合意は (まだ) 得られていません。

if-elif-elseで書いてくれだそうです。

####ちなみに
[ifとcaseの処理速度の差はほとんどない](https://qiita.com/yut_arrows/items/5b230b9dcaea32350725)らしいです。JSの比較記事も誤差の範囲だった。

#まとめ
今回調べていて、（当たり前かもしれませんが）以下のことがわかりました。

```
・言語によって使える構文が違う
・実装したい処理によって使うべき構文が違う
```

基本はif文で力技実装しかしないので、他の構文も使おうと思いました。
とはいえ処理速度が〜とかメモリ使用量が〜とかの根拠がないっぽいので、
使い分けはあくまで好みとか可読性なのかな？というのが今日の結論です。

反復まで書きたかった、、、。

##追記
今度書きたい。
・そもそもアルゴリズムってなに？
・フローチャートってどう書くの？