这个添加算法的Python实现有什么问题?

时间:2016-06-23 15:42:27

标签: python algorithm python-2.7 addition

我已经开始在Coursera上关注斯坦福大学的CS161,"一个关于算法和数据结构的在线课程。"

我抬头找到了围绕整数算术的小学校算法。

我在伪代码中有加法算法,并且有兴趣在 Python 2.7 中实现它(相应地使用MIT标准)。

我已经分析了我的实现并认为它几乎是正确的,但Python解释器可能会对未初始化的列表和变量提供一些反馈。

注意我并不完全精通Python,并且由于缺乏基本数据结构和代码结构的知识,可能会出现一些明显的语法错误。

我对以下代码有几个问题:

def add(a,b):
    i = 0
    carry = 0
    x[i] = [None]*N
    y[i] = [None]*N
    while x[i] > 0 and y[i] > 0:
        x[i], y[i] = a%10, b%10
        a , b = a/pow(10,i+1), b/pow(10,i+1)
        N += i
    for i in range(N):
        x[i] = x[N-i]
        y[i] = y[N-i]
        r[i] = (x[i] + y[i] + carry)%10
        carry = (x[i] + y[i] + carry)/10
    r[N] = carry
    return r  

算法描述:

add()函数将两个N位整数a和b作为输入,并返回一个整数,其中N或N + 1位对应于ab的总和。 / p>

首先将ab分解为大小为N的列表,并通过从最少提取每个数字来保存a(分别为b)的N个数字将数字提供给最大功率为10的数字。

然后将所有x[i]替换为x[N-i](分别为y[i]y[N-i]),然后通过处理x[i]+y[i]来计算x[i]。每次迭代都会进行。

进位按值动态递增。 当for循环结束时,我们将和的最新数字r [N]指定为进位的值(> = 0)。

问题:

  1. 通过分配列表y[i][None]来初始化列表是一件好事。价值为x[i] N次?
  2. 如果y[i]while已初始化,x[i]循环是否会再次有效,因为我的条件是y[i]r[N]
  3. 如何返回整个列表,即列表r[N]?我们应该输入return r还是只返回{{1}}?
  4. 欢迎其他有用的贡献和评论。

1 个答案:

答案 0 :(得分:0)

  1. 是的,这很好,取决于具体情况。您可以做得更好: asm ( "mov $0x00, %%ah \n" "mov $0x00, %%al \n" "int $0x16 \n" : "=a"(c) ); ,但性能非常相似,这不太可能重要 - 可读性才是最重要的。
  2. 如果0是合法值,我会x = [None for _ in xrange(N)]查看值是否为none。否则,我只做x[i] is None检查我是不是非,也不是0或假。
  3. x[i]
  4. 查看以下代码。我修复了add(),包括out of bound索引和算法问题。然后实现了addSimplified(),它可以在没有其他辅助数组的情况下执行相同操作。

    return r