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],如果执行 ,3就会被取出,funcs变为[1,2]。