嘿我正在尝试编写一些不使用任何普通python代码进行乘法,除法或循环的代码。现在我试图做乘法部分。这是我到目前为止所拥有的。
def incr(a):
'''Returns the next integer after a'''
return a + 1
def zero(a):
'''Returns True if a is zero'''
return a == 0
def decr(a):
'''Returns the integer before a'''
return a -1
def add(a, b):
'''Returns the sum of a and b'''
# using only incr, decr, zero, and recursion
a = incr(a)
b = decr(b)
if zero(b) != 1:
add(a,b)
if zero(b) != 0:
print(a)
#return 0
return a #edit
def mult(a, b):
'''Returns the product of a and b'''
# using only add, incr, decr, zero, and recursion
add(a,a)
b= decr(b)
if zero(b) != 0:
mult(a,b)
if zero(b) != 0:
print(a)
#return 0
return a #edit
mult(2,4)
但是,mult()
的代码只是添加,而不是相乘。为此我应该得到8
,但我只得到4
。所以由于某种原因,它没有再次运行脚本。
答案 0 :(得分:1)
Python中的整数是不可变的。这意味着您无法就地修改它们,只将当前范围中的变量重新绑定到新的整数。这意味着您需要使用incr
和decr
之类的返回值,并且您需要编写add
和mult
函数来返回结果。
目前,您的代码忽略了对add
和mult
的递归调用的结果,并在每个函数的末尾无条件地返回0
。这总是会做错事。
我想你想要更像这样的东西:
def add(a, b):
'''Returns the sum of a and b'''
# using only incr, decr, zero, and recursion
if zero(b):
return a
a = incr(a)
b = decr(b)
return add(a,b)
def mult(a, b):
'''Returns the product of a and b'''
# using only add, incr, decr, zero, and recursion
if zero(b):
return 0
b = decr(b)
c = mult(a, b)
return add(a, c)
这两个都适用于任何整数a
和任何非负整数b
。如果您想支持负b
值,则需要新的“原始”函数(例如,sign
函数)。
答案 1 :(得分:1)
要将a和b相乘,您需要为其自身添加b次。对于对参数采用a
和b
的递归函数:每个函数调用都会将a
添加到递归调用的结果中;并且在每次递归调用'b'递减;当b
为零时递归停止。
def mult(a, b):
'''Returns the product of a and b'''
# using only add, incr, decr, zero, and recursion
#base case
if zero(b):
return 0
# a + (a + (a + ... + (0)...))
return add(a, mult(a, decr(b)))
您在解决方案中遗漏的一件事是递归的关键,该函数需要将结果返回给调用它的函数。
答案 2 :(得分:0)
你的逻辑搞乱了你的多功能。
if zero(b) != 0
当b不为0时,计算结果为false。这样可以防止再次调用mult。
你真的不需要指定if zero(b) != 0
,因为这只是将布尔值等同于布尔值。
if !zero(b)
会做同样的事情并且更容易理解。
答案 3 :(得分:-1)
您将遇到一些与您在mult中所做的事情有关的问题,因为mult实际上并没有修改变量a。你正在做的补充是创建a和b的大量副本并在b == 0时打印。这对于mult不起作用,因为你没有设置为add的结果。您将需要一个返回值的递归函数。 例如:
def mult(a, b):
if b == 0:
return 0
b= b-1
temp=0
temp += a
if b != 0:
temp += mult(a,b)
return temp
print(mult(8,8))
阅读引用传递并在Python中传递值
编辑**
def add(a, b):
'''Returns the sum of a and b'''
# using only incr, decr, zero, and recursion
if b != 0:
a = incr(a)
b = decr(b)
a = add(a,b)
return a
def mult(a, b):
temp = 0
if b == 0:
return 0
temp = add(a,temp)
b = decr(b)
if b != 0:
temp = add(mult(a,b),temp)
return temp