Hi I'm new to swift so bear with me if I'm missing something obvious.
I have a function bestSum
which accepts 2 parameters targetNumber
and numbers
, which is an array. The bestSum
function returns an array which contains elements from numbers
which can be added to get the targetNumber
. The returned array is also the shortest combination of numbers that adds up to form targetNumber
. If no combination of numbers could add up to targetNumber
then the function bestSum
returns nil.
var bestSumMemoryDictionary : [Int : [Int]?] = [:]
print(bestSum(targetNumber: 4, numbers: [2,4], memoryDictionary: &bestSumMemoryDictionary))
func bestSum(targetNumber : Int , numbers : [Int] , memoryDictionary : inout [Int : [Int]? ] ) -> [Int]? {
if let value = memoryDictionary[targetNumber]{
return value
}
if targetNumber == 0 {
return []
}
if targetNumber < 0 {
return nil
}
var returningArray : [Int]? = nil
for number in numbers {
let remainder = targetNumber - number
if var bestSumValueArray = bestSum(targetNumber: remainder, numbers: numbers, memoryDictionary: &memoryDictionary){
bestSumValueArray.append(number)
guard var returningArray = returningArray else {
returningArray = bestSumValueArray
continue
}
if bestSumValueArray.count < returningArray.count{
returningArray = bestSumValueArray
}
print(returningArray)
}
print(returningArray)
}
memoryDictionary[targetNumber] = returningArray
return returningArray
}
The returned array is Optional([2, 2])
to generate the sum of 4
, where as the expected and correct value is Optional([4])
.
Issue is happening in the line that contains returningArray = bestSumValueArray
. The print statement below that line is printing [4]
, Where as the next print statement print Optional([2, 2])
. Why the value of returningArray
is different in 2 consecutive print statements ? What am i missing here. Would appreciate any help.
CodePudding user response:
In your code you define 2 variables with same name :
var returningArray : [Int]? = nil // 1st definition
for number in numbers {
let remainder = targetNumber - number
if var bestSumValueArray = bestSum(targetNumber: remainder, numbers: numbers, memoryDictionary: &memoryDictionary){
bestSumValueArray.append(number)
guard var returningArray = returningArray else {
returningArray = bestSumValueArray
continue
} // 2nd definition
if bestSumValueArray.count < returningArray.count{
returningArray = bestSumValueArray
}
print(returningArray) // 2nd variable
}
print(returningArray) // 1st variable
}