Python 乘平方函数

Python 乘平方函数,python,python-3.x,Python,Python 3.x,我一直在尝试编写一个函数,它可以接受不同数量的整数参数,并返回参数平方的乘积 输出应为: 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:

我一直在尝试编写一个函数,它可以接受不同数量的整数参数,并返回参数平方的乘积

输出应为:

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)
我一直在得到“元组索引超出范围”,并没有能够正确地解决这个问题。有人能帮我吗?并演示如何将其转换为递归函数?(如果可能)

星期二我有一个考试,我正在努力理解这背后的逻辑:)


感谢您的任何反馈/指导

对于num\u tuple中的num
意味着迭代
num\u 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:])

对于num\u tuple中的num
意味着迭代
num\u 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:])

为什么需要中间人列表?

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中,我们可以通过检查输入元组的真实性来测试函数是否没有输入。这恰好等同于检查数据结构是否包含任何元素

我们可以很容易地检查元组的长度是否等于(或者在本例中不等于)0

因此,通过以下步骤:

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

为什么您的代码不起作用:

def multiply_squares(*num_tuple):
    return num_tuple[0] ** 2 * multiply_squares(*num_tuple[1:]) if num_tuple else 1
该行:

for num in num_tuple:
迭代
num_tuple
tuple的元素,而不是索引

这意味着在第一个示例中,
num
将是
3
,然后是
2
,然后是
1
。然后,不是用您认为是标记(
0
1
2
)的内容来索引
num\u tuple
),而是用这些函数输入来索引

当元组的长度只有三个元素长时(使
[2]
成为最后一个索引),当您尝试使用
3
索引元组时,这会导致超出范围的错误

要补救您的解决方案,您可以将该行更改为:

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

现在,它可以按预期工作。

为什么需要中间人列表?

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中,我们可以通过检查输入元组的真实性来测试函数是否没有输入。这恰好等同于检查数据结构是否包含任何元素

我们可以很容易地检查元组的长度是否等于(或者在本例中不等于)0

因此,通过以下步骤:

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

为什么您的代码不起作用:

def multiply_squares(*num_tuple):
    return num_tuple[0] ** 2 * multiply_squares(*num_tuple[1:]) if num_tuple else 1
该行:

for num in num_tuple:
迭代
num_tuple
tuple的元素,而不是索引

这意味着在第一个示例中,
num
将是
3
,然后是
2
,然后是
1
。然后,不是用您认为是标记(
0
1
2
)的内容来索引
num\u tuple
),而是用这些函数输入来索引

当元组的长度只有三个元素长时(使
[2]
成为最后一个索引),当您尝试使用
3
索引元组时,这会导致超出范围的错误

要补救您的解决方案,您可以将该行更改为:

for index in range(num_tuple):
然后你的索引就可以了