-Francis. 发表于 2020-4-1 18:35:42

22讲,递归

def factorial(n):
    if n == 1:
      return 1
    else:
      return n * factorial(n-1)


如果n = 5
为什么if n == 1:不是一直循环吗?最后结果不是等于1吗?为什么最后返回的是return n*factorial(n-1)的n
      return 1

_2_ 发表于 2020-4-1 18:37:16

return 意味着这个函数这一次的执行告一段落

_2_ 发表于 2020-4-1 18:38:32

不,不是你想的这样,它是将每次执行函数的返回值再次作为函数的参数,进行计算

_2_ 发表于 2020-4-1 18:41:19

本帖最后由 _2_ 于 2020-4-1 18:43 编辑

factoral(2) 就会返回 2 × factoral(1),由于第二次执行时 n == 1,
所以最终返回的就是2 × 1 = 2

落月沉星 发表于 2020-4-1 18:50:16

你这个函数计算的是5的阶乘,因为if是判断语句,不是循环语句,更不是赋值,输入n=5之后,if语句判断5不等于1,所以执行else

zltzlt 发表于 2020-4-1 18:58:21

return 只是返回当前函数,并不是返回整个递归。

-Francis. 发表于 2020-4-2 07:54:04

_2_ 发表于 2020-4-1 18:41
factoral(2) 就会返回 2 × factoral(1),由于第二次执行时 n == 1,
所以最终返回的就是2 × 1 = 2

为什么第二次执行时 n == 1就会停下来然后返回2*1=2
不能返回1吗?它不是n == 1时就返回1吗?

-Francis. 发表于 2020-4-2 07:59:19

zltzlt 发表于 2020-4-1 18:58
return 只是返回当前函数,并不是返回整个递归。

那if n == 1: 时它不是return 1不是已经返回1了吗?不应该最后返回的是1
为什么反而是return n * factorial(a-1)

zltzlt 发表于 2020-4-2 08:00:07

-Francis. 发表于 2020-4-2 07:59
那if n == 1: 时它不是return 1不是已经返回1了吗?不应该最后返回的是1
为什么反而是return n * factor ...

只是返回一层递归。

-Francis. 发表于 2020-4-2 08:02:45

zltzlt 发表于 2020-4-1 18:58
return 只是返回当前函数,并不是返回整个递归。

它不用返回1吗?
返回1不应该n=1吗?

zltzlt 发表于 2020-4-2 08:03:41

-Francis. 发表于 2020-4-2 08:02
它不用返回1吗?
返回1不应该n=1吗?

返回 1 只是返回一层,在函数中多次调用了自身

-Francis. 发表于 2020-4-2 08:24:58

zltzlt 发表于 2020-4-2 08:03
返回 1 只是返回一层,在函数中多次调用了自身

如果n==2时不应该是在返回return n * factorial(n-1)后
n == 1:再返回return 1吗?


返回1只是一层什么意思??

_2_ 发表于 2020-4-2 08:54:25

-Francis. 发表于 2020-4-2 07:59
那if n == 1: 时它不是return 1不是已经返回1了吗?不应该最后返回的是1
为什么反而是return n * factor ...

它会把另一个函数的返回值相乘再返回,这是一个回溯的过程

-Francis. 发表于 2020-4-2 09:13:17

_2_ 发表于 2020-4-2 08:54
它会把另一个函数的返回值相乘再返回,这是一个回溯的过程

if n == 1:只能return 1吗?

永恒的蓝色梦想 发表于 2020-4-2 09:40:17

-Francis. 发表于 2020-4-2 09:13
if n == 1:只能return 1吗?

你愿意return几就return几

会计的会怎么念 发表于 2020-4-2 11:34:13

def factorial(n):# 定义一个函数,可以接受一个参数,看你函数的运算,参数只能是int类型
    if n == 1: #条件判断,如果n为1
      return 1 #返回一个int 1
    else:#如果n不为1
      return n * factorial(n-1)#递归运算

你举得例子:
- 如果n为5,参数传入后,条件判断n不为1
- 执行else后的语句,
- 递归传入n-1,也就是4
······················
- 递归直到传入的参数为1,返回1,结束
- 实际上就是5*4*3*2*1

EveLee 发表于 2020-4-2 17:17:29

n = 5 --> return 5 * factorial(4)
n = 4 --> return 4 * factorial(3)
n = 3 --> return 3 * factorial(2)
n = 2 --> return 2 * factorial(1)
n = 1 --> return 1   #此处的值1是返回给上一层的factorial(1)的,然后上一层的值变成2 * 1返回给再上一层factorial(2),这样一层一层返回到最上面就变成return 5*4*3*2*1,那就是120啦
页: [1]
查看完整版本: 22讲,递归