我一直在尝试编写一个函数,该函数可以使用不同数量的整数参数,并返回参数平方的乘积。
输出应为:
multiply_squares(3,2,1)
multiply_squares(2,5)
36
100
到目前为止,我一直在玩这个游戏:
def multiply_squares(*num_tuple):
result = []
for num in num_tuple:
c = num_tuple[num]**2
result.append(c)
for i in result:
d *= result[i]
print(d)
multiply_squares(3,2,1)
multiply_squares(2,5)
我已经得到“元组索引超出范围”,并且无法正确解决此问题。有人可以帮我吗?并向我展示如何将其转换为递归函数?(如果可能)
我在星期二进行了测试,我试图理解其背后的逻辑:)
感谢任何反馈/指导!
答案 0 :(得分:2)
for num in num_tuple
意味着迭代num_tuple
并将每个值设置为num
。 num
不是元组的索引。
def multiply_squares(*num_tuple):
result = []
for num in num_tuple:
c = num**2
result.append(c)
d = 1
for i in result:
d *= i
print(d)
return d
multiply_squares(3,2,1)
multiply_squares(2,5)
关于递归解决方案:
def multiply_squares(*num_tuple):
if not num_tuple: # Base case:
return 1
return (num_tuple[0] ** 2) * multiply_squares(*num_tuple[1:])
答案 1 :(得分:1)
为什么需要中介名单?
def multiply_squares(*num_tuple):
r = 1
for n in num_tuple:
r *= n * n
return r
它有效:
>>> multiply_squares(3,2,1)
36
>>> multiply_squares(2,5)
100
递归:
def multiply_squares(*num_tuple):
return num_tuple[0] ** 2 * multiply_squares(*num_tuple[1:]) if num_tuple else 1
为了帮助理解,我只将输入打印到每个函数调用中:
>>> multiply_squares(3,2,1)
(3, 2, 1)
(2, 1)
(1,)
()
36
因此每个被叫来的人都知道:其工作和投入(数字)。因此,返回的所有内容(返回给初始调用方(您)还是位于其上方的人)就是输入平方的乘积。
要做到这一点,这个家伙可以通过将第一个输入的平方乘以其他输入的平方乘积的结果(通过递归调用自己)来解决问题。
这将完美地工作...直到最终没有其他输入。在这种情况下,那个人做什么?好吧,这是一个特例,只有解决与他相同的问题的另一个人才能实例化。而他上方的人则依靠他返回那个人剩余输入的平方的乘积,以便他可以将其结果乘以该结果。因此,他必须返回1
,否则整个系统将无法正常工作。
在Python中,我们可以通过检查输入元组的真实性来测试该函数是否没有输入。恰好等于检查该数据结构是否包含任何元素。
即
bool(tuple()) #empty tuple
#False
bool((1,2,3)) #populated tuple
#True
我们可以轻松地检查元组的长度是否等于0
。(在这种情况下不等于)。
即
len(tuple()) != 0
#False
len((1,2,3)) != 0
#True
因此逐步完成:
num_tuple[0] ** 2 * multiply_squares(*num_tuple[1:]) if num_tuple else 1
# ^ ^ ^ ^ ^
# 1st input sqrd | by the prod of sqrs of rest | given inputs | otherwise 1
# multiplied only if
您的代码为什么不起作用:
该行:
for num in num_tuple:
重复num_tuple
元组的元素,而不是索引。
这意味着在第一个示例中,num
将是3
,然后是2
然后是1
。然后,与其使用您认为是索引的索引(num_tuple
,0
和1
来索引2
,而是使用函数的这些输入来索引。>
当元组的长度只有三个元素长(使3
为最后一个索引)时,当您尝试使用[2]
为元组建立索引时,会导致超出范围的错误。
要补救您的解决方案,您可以将该行更改为:
for index in range(num_tuple):
,然后您的索引将起作用(如果您还用num
替换了所有以前出现的index
)。
或者,更好的解决方案是完全放弃索引并直接使用元素,因为这正是您想要的。
这看起来像:
def multiply_squares(*num_tuple):
result = []
for num in num_tuple:
c = num**2
result.append(c)
r = 1
for i in result:
r *= i
return r
现在可以正常工作了。
答案 2 :(得分:0)
请使用assertion
查看此两行解决方案(由于functools.reduce
):
from functools import reduce
a = (3, 2, 1)
b = (2, 5)
c = 2
def multiply_squares(*nums):
assert nums # make sure we get input
return reduce(lambda x, y: x * (y**2), nums, 1)
print(multiply_squares(*a))
print(multiply_squares(*b))
print(multiply_squares(c))
print(multiply_squares())
'''Output:
36
100
4
Traceback (most recent call last):
File "test.py", line 16, in <module>
print(multiply_squares())
File "test.py", line 9, in multiply_squares
assert nums
AssertionError
'''
实际上非常强大。