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))
公式ドキュメントを参照するとdropLast
はSubstring
をかえすらしい。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]))