学习boy123 发表于 2020-5-18 15:19:16

关于递归的问题

还不是很能理解递归的 参数-1的概念,有大佬帮忙解释下吗,谢谢!

qiuyouzhi 发表于 2020-5-18 15:21:22

?????????????

Twilight6 发表于 2020-5-18 15:21:34

代码发上来,不然我们不懂你说的-1 指的是啥

xiaosi4081 发表于 2020-5-18 15:25:10

不把代码发过来,这就相当于猜谜游戏

学习boy123 发表于 2020-5-18 15:47:54

类似这种:
def test(n):
if n == 1:
return 1
else:
return test(n-1) +1

_2_ 发表于 2020-5-18 15:50:56

学习boy123 发表于 2020-5-18 15:47
类似这种:
def test(n):
if n == 1:


这是一个函数的递归,就是函数自己调用自己
这个例子的结果最终会返回 1(假设不考虑非负整数,如果是非负整数就无法退出循环),你的这个例子不是特别好

学习boy123 发表于 2020-5-18 16:00:52

_2_ 发表于 2020-5-18 15:50
这是一个函数的递归,就是函数自己调用自己
这个例子的结果最终会返回 1(假设不考虑非负整数,如果是 ...

test(n-1) +2 是不是好点。

主要我想问的是这个n-1该怎么理解,只是单纯的传入参数-1吗。
如果传入的参数是4,返回值是7,就是不理解这个计算过程。。

sunrise085 发表于 2020-5-18 16:07:11

学习boy123 发表于 2020-5-18 15:47
类似这种:
def test(n):
if n == 1:


def test(n):
    if n == 1:
      return 1
    else:
      return test(n-1) +1
      
a=test(4)
print(a)
递归函数,就是自己调用自己
最深层次的递归是返回一个确切值,不再需要递归调用

以你的程序为例,假设调用的时候n=4
第一次调用,n=4,不符合if条件,需要返回test(3)+1,进行第二次调用,
    第二次调用,n=3,不符合if条件,需要返回test(2)+1,进行第三次调用
      第三次调用,n=2,不符合if条件,需要返回test(1)+1,进行第四次调用
            第四次调用,n=1,符合if条件,返回1
      返回第三次调用,得到1+1,返回2
    返回第二次调用,得到2+1,返回3
返回第一次调用,得到3+1,返回4

Twilight6 发表于 2020-5-18 16:09:17

def test(n): # 假设 n = 3   递归第一次 n = 3-1=2 # 第二次递归n=1
    if n == 1:# 开始因为n=3条件不成立执行else 第一次递归: n=2,n!=1则执行else
      # 第二次递归因为n=1,条件成立test(1)返回1
      return 1
    else:# 开始 n=3# 递归第一次n = 2
      return test(n-1) +1 # 开始递归test(3-1) + 1 第二次递归开始 test(2-1)+1
    # 递归顺序 test(3)->test(2)->test(1)
    # 返回结果 test(1)=1 -> test(2)+1 -> test(3) +1
    # 结果就是   1               +1            +1
# 输出等于3

_2_ 发表于 2020-5-18 16:09:32

本帖最后由 _2_ 于 2020-5-18 16:10 编辑

学习boy123 发表于 2020-5-18 16:00
test(n-1) +2 是不是好点。

主要我想问的是这个n-1该怎么理解,只是单纯的传入参数-1吗。


如果返回 test(n) 就是死循环:
def test(n):
    if n == 1: return 1
    else: return test(n) - 1
    # 可以写成一行,但通常不希望你这样做,会降低代码可读性,这里只是作为演示
就会一直执行 else 下的内容(除非输入为 1)

学习boy123 发表于 2020-5-18 16:11:10

sunrise085 发表于 2020-5-18 16:07
递归函数,就是自己调用自己
最深层次的递归是返回一个确切值,不再需要递归调用



这个例子不是很好,如果else 返回的是test(n-1) +2传参4,返回的是7该怎么理解。

Twilight6 发表于 2020-5-18 16:15:02

本帖最后由 Twilight6 于 2020-5-18 16:16 编辑

def test(n): # 假设 n = 3   递归第一次 n = 3-1=2 # 第二次递归n=1
    if n == 1:# 开始因为n=3条件不成立执行else 第一次递归: n=2,n!=1则执行else
      # 第二次递归因为n=1,条件成立test(1)返回1
      return 1
    else:# 开始 n=3# 递归第一次n = 2
      return test(n-1) +1 # 开始递归test(3-1) + 1 第二次递归开始 test(2-1)+1
    # 递归顺序 test(3)->test(2)->test(1)
    # 返回结果 test(1)=1 -> test(2)+1 -> test(3) +1
    # 结果就是   1               +1            +1
# 输出等于3

这边从最后的test开始返回

test最后一次递归时候return的值是1

最后次递归结束后一层层 返回比如test(1)->test(2)....->test(n)

因为最后一次test(1) = 1 ,而其他大于1 的 是 return test(n)+1

则每次递归回来都+1

即:
test(1)->test(2)....->test(n)
1+1+....+1(一共n个1)

沐羽尘 发表于 2020-5-18 16:17:07

学习boy123 发表于 2020-5-18 16:00
test(n-1) +2 是不是好点。

主要我想问的是这个n-1该怎么理解,只是单纯的传入参数-1吗。


之前看过这样一个描述递归“就像进入一个房间1,房间里有个箱子,箱子告诉你钥匙在2号房间里,然后你就进入到2号房间,结果发现1号的钥匙锁子2号房间的箱子里,而2号箱子的钥匙在3号房间箱子里,以此类推,你就需要不停滴进入下一个房间,直到你进入一个没有箱子上锁的房间,拿到上一个房间箱子的钥匙,然后不断返回”
递归的话,你肯定要考虑好让函数最终能在一个房间拿到钥匙,也就是if n == 1:
    return 1你这一句这样的
如果传入的是一个负数或者说一个浮点数,那这个n就永远不等于1,也就永远拿不到钥匙,是一个死循环,而且递归的话电脑需要记住一个一个房间的名字,这样的话如果层数太多,他就要花大量的内存去记住它,效率就会下降

sunrise085 发表于 2020-5-18 16:19:14

学习boy123 发表于 2020-5-18 16:11
这个例子不是很好,如果else 返回的是test(n-1) +2传参4,返回的是7该怎么理解。

很难理解吗?
把我刚刚写的那段中,函数调用返回时的+号后面的1改为2,不就得到结果了吗?

第一次调用,n=4,不符合if条件,需要返回test(3)+2,进行第二次调用,
    第二次调用,n=3,不符合if条件,需要返回test(2)+2,进行第三次调用
      第三次调用,n=2,不符合if条件,需要返回test(1)+2,进行第四次调用
            第四次调用,n=1,符合if条件,返回1
      返回第三次调用,得到1+2,返回3
    返回第二次调用,得到3+2,返回5
返回第一次调用,得到5+2,返回7

学习boy123 发表于 2020-5-18 16:25:15

Twilight6 发表于 2020-5-18 16:15
这边从最后的test开始返回

test最后一次递归时候return的值是1


看了你的解释我理解了。n就是递归的次数,我的列子传入3的话就等于1+2+2+2。

学习boy123 发表于 2020-5-18 16:27:19

sunrise085 发表于 2020-5-18 16:19
很难理解吗?
把我刚刚写的那段中,函数调用返回时的+号后面的1改为2,不就得到结果了吗?



看了12楼的我理解是n为递归的次数,传入3就相当于1+2+2+2,没错吧。

Twilight6 发表于 2020-5-18 16:30:47

学习boy123 发表于 2020-5-18 16:27
看了12楼的我理解是n为递归的次数,传入3就相当于1+2+2+2,没错吧。

n是不是递归次数要看你代码而定的

学习boy123 发表于 2020-5-18 16:32:42

Twilight6 发表于 2020-5-18 16:30
n是不是递归次数要看你代码而定的

我明白的,我说的只是举例代码这样理解,具体还要看代码的条件。

Twilight6 发表于 2020-5-18 16:33:23

学习boy123 发表于 2020-5-18 16:32
我明白的,我说的只是举例代码这样理解,具体还要看代码的条件。

嗯嗯 加油继续学习吧!

sunrise085 发表于 2020-5-18 16:34:45

学习boy123 发表于 2020-5-18 16:27
看了12楼的我理解是n为递归的次数,传入3就相当于1+2+2+2,没错吧。

n是调用函数是的参数,不一定是递归次数。递归次数是有你的递归中介条件和每次递归时参数的改变决定的
def test(n):
    if n <= 1:
      return 1
    else:
      return test(n-2) +2
      
a=test(7)
print(a)
看上面这个程序,第一次调用的时候n=7,但是test函数只被调用了4次
页: [1] 2
查看完整版本: 关于递归的问题