Python 仅使用递归的乘法
嘿,我正在尝试编写一些不使用任何普通python代码进行乘法、除法或循环的代码。现在我正在做乘法部分。这是我到目前为止所拥有的Python 仅使用递归的乘法,python,python-3.x,recursion,Python,Python 3.x,Recursion,嘿,我正在尝试编写一些不使用任何普通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 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
。因此,出于某种原因,它不会再次运行脚本。您只是在mult函数中把逻辑搞乱了
if zero(b) != 0
当b不是0时,该值计算为false。这将防止mult再次被调用
如果零(b)!=0因为这只是将布尔值等同于布尔值
if!zero(b)
会做完全相同的事情,并且更容易理解 您在mult中的操作将遇到一些问题,因为mult实际上并没有修改变量a。您在add中所做的是创建a和b的大量副本,并在b==0时进行打印。这对mult不起作用,因为您没有将a设置为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
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
值,你需要新的“基本”函数(例如,a符号
函数)。要将a和b相乘,你需要将a自身加上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)))
解决方案中缺少的一点是递归的关键,即函数需要将结果返回给调用它的函数。尝试打印函数中的a和b值。请注意,您没有从函数中返回任何内容(零除外)。我将返回内容更改为
返回a
,并添加了一些打印内容,以查看它们在做什么。但是最终结果从未改变,所以我将mult中的add(a,a)
更改为a=add(a,a)
,它仍然返回4,当我执行``a=a+add(a,a)`时,它仍然返回4。为什么它根本不改变a的值呢?虽然这比我的代码要好得多,但我遇到了它返回错误数字的问题mult(2,4)
返回一个16的值,因此在代码中的某个地方它会运行两次。每次调用时,您都会将a
加倍-->a^b
我用mult
实现修复了数学问题,并将添加到我认为稍微好一点的样式中(用它自己的return
语句将基本用例放在前面)。