仅使用递归的乘法

时间:2017-11-10 21:47:35

标签: 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 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。所以由于某种原因,它没有再次运行脚本。

4 个答案:

答案 0 :(得分:1)

Python中的整数是不可变的。这意味着您无法就地修改它们,只将当前范围中的变量重新绑定到新的整数。这意味着您需要使用incrdecr之类的返回值,并且您需要编写addmult函数来返回结果。

目前,您的代码忽略了对addmult的递归调用的结果,并在每个函数的末尾无条件地返回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次。对于对参数采用ab的递归函数:每个函数调用都会将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