首先,我不认为这是伪代码,而是用一种真正的语言编写的代码,可能是从(S)ML派生的语言。如果你知道它是什么语言,那么解释它会容易得多,而不是试图猜测shift是什么意思,你可以在文档中查找该语言。在

也就是说,有很多东西你显然翻译错了。在

首先,你改变了这个:if |A| ≤ 1

…到这里来:

^{pr2}$

除了添加无意义的额外括号之外,您还打破了being为空的递归基本情况。在

接下来,par可能只是意味着“如果你想的话,你可以并行地做这些事情”,所以可以忽略它。另一方面,考虑到你是从一个关于并行算法和数据结构的课堂讲稿中得到的,你忽略的可能是整个点。显然,在Python中,您需要将它映射到不同的东西—例如,创建一个concurrent.futures.ProcessPoolExecutor,提交四个递归调用,然后等待所有四个未来?(尽管这可能意味着这是一种尽可能晚的绑定语言,在这种情况下,您不想在这里等待未来,而是更改每个使用这些值之一的表达式,以便它等待它需要的未来,并将这些表达式提交给执行者。)

总之,您已经将对所定义函数的递归调用转换为对其他函数的调用。所有这些:pr = binary_mult(p,r)

ps = binary_mult(p,s)
rq = binary_mult(r,q)
qs = binary_mult(q,s)
…需要调用mult。在

let … in … end实际上是一种表示第一个……是第二个……的一组局部变量的方法…。你可以通过在每个变量上用一个del替换end来翻译它,但是我认为你可以忽略它。在

但你忽略了最重要的部分,这一点:shift(pr, n) + shift(sum, n/2) + qs

我不确定最后一个+是+。它可能是一个不同的符号,或者是光标在+上移动时拍摄的屏幕截图,也可能是+上有一点灰尘的打印输出的扫描,或者其他一些很好的例子,说明当你需要文本中的代码帮助时,为什么应该发布文本而不是文本的图片

不管怎样,你需要做任何事情(并返回结果)。这是函数的关键部分;所有的let … in都是为这个表达式设置的。在

根据你对函数含义的猜测,以及我对几乎是SML语法的猜测,忽略了并行位,你写的类似于直接翻译的东西:def shift(A, n):

# Taking a wild guess
return A + [0 for _ in range(n)]
def mult(A, B):
n = len(A)
if n <= 1:
return [A[0] * B[0]]
else:
p, q = A[:n//2], A[n//2:]
r, s = B[:n//2], B[n//2:]
pr, ps, rq, qs = mult(p, r), mult(p, s), mult(r, q), mult(q, s)
sum = ps + rq
return pr << n + sum << n//2 + qs

我敢打赌我们至少猜错了一件事。例如,也许+应该是元素级加法,而不是列表连接。唯一的方法是用一些数字运行它并检查输出。唯一的问题是,我甚至不知道输入是什么。也许是二进制数字的大端位值表?在这种情况下,+必须是带进位的元素加法。在

事实上,这些东西有可能同时作为数字和比特的大端表使用。没有内置的Python类型是这样工作的,但是构建一个或者在PyPI上找到一个并不难。bitarray和{}看起来像是似是而非的候选者。在