なれない言語でコーディングするってことは、毎回新たな発見があるという事です。
これを苦しみと捉えるか、楽しみと捉えるかで、エンジニアの質が決まるのではないでしょうか?
多くの初心者の人がゴールに行くまでが苦痛で、ゴールした時に快感を得られると思っているようですが、模索する途中をいかに楽しめるかが本質である事を今回のコーディングで改めて認識しました。
別に対して難しいプログラムでもないのに、慣れないコーディングってそれだけ思い通りに行かないって事。
ソースコード
package main
import "fmt"
func midPoint(nums []int) int {
return int(float64 (len(nums) / 2) + 0.5)
}
func setMerge(arr1 []int , arr2 []int) []int {
arr := []int{}
for len(arr1) > 0 || len(arr2) > 0 {
if len(arr1) == 0 {
arr = append(arr , arr2[0])
arr2 = arr2[1:]
} else if len(arr2) == 0 {
arr = append(arr , arr1[0])
arr1 = arr1[1:]
} else if arr1[0] > arr2[0] {
arr = append(arr , arr2[0])
arr2 = arr2[1:]
} else{
arr = append(arr , arr1[0])
arr1 = arr1[1:]
}
}
return arr
}
func mergeSort(numbers []int) []int {
if len(numbers) == 0 {
numbers = nil
} else if len(numbers) == 1 {
numbers = numbers
} else if len(numbers) == 2 {
if numbers[0] > numbers[1] {
var tmp int = numbers[0]
numbers[0] = numbers[1]
numbers[1] = tmp
}
} else{
var midNum int = midPoint(numbers)
arr1 := []int{}
arr2 := []int{}
arr1 = numbers[0:midNum]
arr2 = numbers[midNum:]
arr1 = mergeSort(arr1)
arr2 = mergeSort(arr2)
numbers = setMerge(arr1 , arr2)
}
return numbers
}
func main(){
numbers := []int{10 , 2 , 12 , 7 , 16 , 8 , 13}
nums := mergeSort(numbers)
fmt.Println(nums)
}
実行
$ go run mergeSort.go
[2 7 8 10 12 13 16]
解説
GO言語のif文の書き方要注意!
以前もハマった内容ですが、改めて書いておきますが、if文におけるelseとelse ifは、他の言語のように柔軟な書き方ができません。
たとえば・・・
if(...){
~~
}
else if (..){
~~
}
else{
~~
}
このように書くとexpected errorになります。
エラーにならない書き方は以下
if(...){
~~
}else if (..){
~~
}else{
~~
}
配列操作
# 配列に追加
arr := []int{}
arr = append(arr , 1)
arr = append(arr , 2)
> {1 , 2}
# slice
arr := []int{1,2,3,4,5}
arr = arr[1:2]
> {1 , 2}
arr = arr[3:]
> {4 , 5}
arr = arr[:3]
> {1 , 2 , 3}
少数を整数に変換
func midPoint(nums []int) int {
return int(float64 (len(nums) / 2) + 0.5)
}
return内部の少数計算の箇所はfloat64という型にして、それをintで変換しています。
C言語などで慣れている人は気にならないけど、インタプリタ系の言語しか触っていない人は、頑張って慣れましょう。
関連記事
たくさんのプログラム言語でアルゴリズム学習
0 件のコメント:
コメントを投稿