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

嘿,我正在尝试编写一些不使用任何普通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
。因此,出于某种原因,它不会再次运行脚本。

您只是在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
语句将基本用例放在前面)。