我在这集视频里想要做的是 讲清楚
“跌代”与递归之间的差别
或者我应该说迭代
我总是发音错误- 迭代函数的定义
与递归函数定义的差别
我们会通过这样的方法来完成比较
理解这边的迭代函数是怎么样工作的
以及右边这个递归函数是怎么样工作的
那么当我们开始的时候
会看到product被设置成1
然后进入到for循环里
而for循环实际上是
迭代函数定义的“肉”
而为了理解for循环里发生了什么
我在这里做一个表格
我给变量i的值做一个表格
并且我也会找出
变量product乘以i+1的值是什么
因为在for循环的每次迭代中
我们都会计算这里这个表达式的值
然后我会给product的新值
也做出一列表格
product的新值
我给它们标上下划线
然后就有了product的新值
我们在很久之前就知道
在Python里的“for i in range”
这里的range部分
这里的range返回一列数
它返回一列number的元素
我们之前已经将其传递给number
那么如果我们假设 我一开始就应该说的
假设我们正调用-
为了讲的更详细
假设这是调用factorial(3)的结果
那么我们传递给函数factorial的参数是3
那么变量number就指向3
当你调用range(number)时
它就会按照字面意思那样返回一个数列[0,1,2]
那么三个元素从0开始
最后一个元素是3减1 也就是2
那么在这个for循环的每次循环中
变量i将会被依次赋值成
数列里的数
那么在for循环的第一次循环中
i将会被赋值成0
那么我们的i就将要指向0
然后product乘以(i+1)
好吧 在第一次循环时
product在进入for循环之前就出现了 它被定义为1
那么product就是1 而这个表达式就是1乘以-
我不想用这个颜色来做
我用-
我用绛红色把它写出来-
1乘以i-- i是0 1乘以(0+1)
加1 然后我们新的product的值就是
将这个表达式计算出来的值
就在这里
product等于这堆东西
那么我们新的值就是1乘以0加1
就是1乘以1 也就是1
这就是在循环语句内的所有东西了
因为这就是在for循环里
要完成的全部事情了
然后我们回到上面去
我们将会进行
在for循环里的下一次迭代了
我猜你们会说 现在i将被赋值成1了
那么现在i等于1
这里的这个表达式
我们取product的旧值
那么product还是1 所以product是1
它要乘以i i现在是1了 1再加上1
这等于什么呢？
如果你把这些计算出来 就会得到1乘以2
所以现在product的新值就是2
那么在我们的第二次迭代后
在我们第二次循环完成后
现在它将会回到for循环的起点
而i将赋值为数列里的下一个数
它现在将被赋值成2
那么现在i是2 而这里的这个东西 我们将会有-
这个是product- product现在是2
所以它就是2乘以i…
而i现在是2 再加上1 那么它就是这样的
它是2乘以3或者说6
所以新的product是6 然后继续 我们会说：
好吧 我们还能把i赋值成这里面的其他数吗？
不行 我们已经用完了所有的数 所以我们会
跳出for循环 然后我们返回product
或者说变量product所指向的东西
实际上这才是我应该说的东西
应该返回product所指向的那个值
那个值是6
所以当你调用factorial(3) 它将返回6
所以如果你说factorial-
如果你要求factorial(3)加上factorial(3)
那就要计算这个表达式
这个表达式算出来是6
而这里这个表达式算出的值也是6
因为这就是函数返回的值
然后如果你把它们加起来的话 就是12
所以这就是我们为什么叫它迭代
我们一直通过相同的一套指令来进行迭代
现在让我们来比较一下递归的定义
它在很多方面都更加有趣
又一次 我们将调用factorial(3)
factorial(3)
所以3就是我们的参数
而这就是number所指向的值
然后判断number是否小于等于1
好吧 3不小于等于1
所以我们不会运行这部分的语句
我们将会来到else语句
那么我们将会返回number-
我们要返回number乘以这个的阶乘
所以它的值就会是number- number是3-
那是我们传递的参数
乘上number减1的阶乘
而number减1的值是2 3减1等于2
所以就是factorial(2)
好吧 那是另一个调用factorial的函数
所以我们返回去
还是factorial函数 只是参数现在是2 所以number是2
我们继续 如果number小于等于1 我们执行这条语句
但是number没有小于等于1
它是2 所以我们转到else部分
那么我们现在想要返回的是
number乘上factorial(number-1)
那么在这个情况下…
在这个情况下 number现在是2
而现在我们要将它乘上
乘上factorial(2-1)
好吧 2减1就是1
乘以factorial(1)
好吧 我们又做了一个函数调用
那么解释器不得不记住
我们做的这一系列的函数调用
并不得不一直向更深处挖掘
那么现在 我们调用了factorial(1)
factorial(1) 1是参数
number现在指向1
如果number小于等于1
number确实小于等于1
现在这就是我们所称的基本情况
我们一直在走向它
那么number小于等于1 返回1
那么在这个情况下
当我们调用factorial(1) 它就会返回1
所以我们现在知道了
factorial(2)等于2乘以1
那么这就等于2
我们知道factorial(3)等于3乘以2
也就是6
所以 非常不一样的思考方式
却得到了完全一样的结果
又一次 如果你计算factorial(3)加上factorial(3)
你用哪种方式来完成它并没关系
我们会得到6加6或者说12