Python中howSum函数返回结果异常求助:期望得到[2,2,2,2]却返回[[[[[],2],2],2],2]
Hey there! Let's break down why your howSum function is returning a nested list like [[[[[], 2], 2], 2], 2] instead of the flat [2, 2, 2, 2] you expect.
The Root Cause
The problem lies in how you're combining the recursive result with the current number. Right now, your code does:
return [remainderResult, num]
This takes the existing result list (from the recursive call) and wraps it inside a new list along with num. Every recursive step adds another layer of nesting, which is why you end up with all those extra brackets.
The Fix
Instead of wrapping the existing result, you want to append the current number to the end of the existing result list. You can do this using list concatenation:
return remainderResult + [num]
This takes the flat list from the recursive call and adds num as a new element at the end, keeping the entire structure flat.
Updated Code
Here's the corrected version of your function:
def howSum(targetSum, numbers): if targetSum == 0: return [] if targetSum < 0: return None for num in numbers: remainder = targetSum - num remainderResult = howSum(remainder, numbers) if remainderResult != None: return remainderResult + [num] # Changed this line return None
Testing It Out
If you run howSum(8, [2]) now, it will correctly return [2, 2, 2, 2] instead of the nested mess. Each recursive step builds onto the flat list:
- When
targetSumis 0, return[] - For targetSum 2:
[] + [2]→[2] - For targetSum 4:
[2] + [2]→[2, 2] - And so on until targetSum 8 gives the full flat list.
Bonus: Optional Optimization
If you plan to use this function with larger target sums or number lists, adding memoization (caching) will speed things up a lot by avoiding repeated calculations. Here's how you could add that:
def howSum(targetSum, numbers, memo=None): if memo is None: memo = {} if targetSum in memo: return memo[targetSum] if targetSum == 0: return [] if targetSum < 0: return None for num in numbers: remainder = targetSum - num remainderResult = howSum(remainder, numbers, memo) if remainderResult != None: memo[targetSum] = remainderResult + [num] return memo[targetSum] memo[targetSum] = None return None
内容的提问来源于stack exchange,提问作者S kumar

