8.2_使用循环实现

8.2 使用循环实现

接下来将前面的“使用递归实现”替换为“使用循环实现”。代码如下所示。

steps/step08.py

class Variable: def backward(self): funcs  $=$  [self creator] while funcs: f  $=$  funcs.pop() #获取函数 x,y  $=$  f-input,f.output #获取函数的输入 x.grad  $=$  f.backup(y.grad) #backward调用backward方法 ifx creator is not None: funcss.append(x creator) #将前一个函数添加到列表中

上面的实现使用了循环。关键点在于按顺序向funcs列表里添加应该处理的函数。在while循环中,通过funcs.pop()获取要处理的函数,将其作为变量f,然后调用函数f的backward方法。通过f_input和f_output获取函数f的输入变量和输出变量,就可以正确地设置f_backward()的参数和返回值。

列表的pop方法会删除列表末尾的元素,并取出这个元素的值。例如,对于funcs = [1, 2, 3],如果执行 x=funcs.pop()x = \text{funcs.pop()} ,3就会被取出,funcs变为[1,2]。