LoginSignup
0
1

More than 5 years have passed since last update.

なっとく!アルゴリズム(p64)再帰

Last updated at Posted at 2019-03-11

p64の練習問題(4.1)

4.1 sum関数のコードを書いてみる

答えを見ずに書いたらこんな感じ

func sum(array: [Int]) -> Int {
    var arr = array

    if arr.count < 2 {
        return arr[0]
    }
    return arr[ arr.count - 1 ] + sum(array: Array(arr.dropLast(1)))

}

print(sum(array: [1,2,3,4]))

解答を参考にするともう少しスマートにかけたかな?

def sum(list):
   if list == []:
      return 0
   return list[0] + sum(list[1:])
func sum(array: [Int]) -> Int {
    var arr = array
    guard arr.isEmpty else {
        return arr[0] + sum(array: Array(arr.dropFirst(1)))
    }

    return 0
}

print(sum(array: [1,2,3,4]))

詰まったころ

下記のように書くと

func sum(array: [Int]) -> Int {
    var arr = array

    if arr.count < 2 {
        return arr[0]
    }
    return arr[ arr.count - 1 ] + sum(array: arr.dropLast(1))

}

print(sum(array: [1,2,3,4]))

エラーメッセージが出た

main.swift:7:50: error: cannot convert value of type 'ArraySlice<Int>' to expected argument type '[Int]'
    return arr[ arr.count - 1 ] + sum(array: arr.dropLast(1))

公式ドキュメントを参照するとdropLastSubstringをかえすらしい。arrayを返すのだと思ってた。

func dropLast(_ k: Int) -> Substring

対策

Array(arr.dropLast(1))とかいて型を変換した

4.2 リスト内の要素の個数を数える再帰関数を書いてみる

func count(array: [Int]) -> Int {
    var arr = array

    guard arr.isEmpty else {
        return 1 + count(array: Array(arr.dropFirst(1)))
    }
    return 0
}

print(count(array:  [1,2,3,4,7]))

4.3 リストに含まれている数字のうち、最も大きな数字を見つけ出す

これも答えを見ずに考えたらこんな感じ ちょっと汚い

func largeNumber(array: [Int]) -> Int {
    var arr = array

    if arr.count < 2 {
        return arr[0]
    }

    if arr[ arr.count - 1 ] == largeNumber(array: Array(arr.dropLast(1))) {
        return arr[ arr.count - 1 ]
    } else if arr[ arr.count - 1 ] < largeNumber(array: Array(arr.dropLast(1))) {
        return largeNumber(array: Array(arr.dropLast(1)))
    } else {
        return arr[ arr.count - 1 ]
    }
}

print("largeNumber(array: [1,2])",largeNumber(array: [1,9,6]))

教本の答えはこんな感じ

def max(list):
   if len(list) == 2:
      return list[0] if list[0] > list[1] else list[1]
   sub_max = max(list[1:])
   return list[0] if list[0] > sub_max else sub_max

Swiftで書いてみるとこんな感じ
唐突にarr.count == 2って書いてあったらちょっとわかりにくいかも・・・・

func largeNumber(array: [Int]) -> Int {
    var arr = array

    if arr.count == 2 {
        return arr[0] > arr[1] ? arr[0] : arr[1]
    }
    var subMax = largeNumber(array:Array(arr.dropLast(1)))
    return arr[0] > subMax ? arr[0] : subMax
}

print("largeNumber(array: [1,2])",largeNumber(array: [1,9,6]))

参考文献

Swift の Array やら ArraySlice やらポインタの変換まとめ

Apple docment popLast()

Apple docment dropLast(_:)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1