关于递归的问题
还不是很能理解递归的 参数-1的概念,有大佬帮忙解释下吗,谢谢! ????????????? 代码发上来,不然我们不懂你说的-1 指的是啥 不把代码发过来,这就相当于猜谜游戏类似这种:
def test(n):
if n == 1:
return 1
else:
return test(n-1) +1 学习boy123 发表于 2020-5-18 15:47
类似这种:
def test(n):
if n == 1:
这是一个函数的递归,就是函数自己调用自己
这个例子的结果最终会返回 1(假设不考虑非负整数,如果是非负整数就无法退出循环),你的这个例子不是特别好 _2_ 发表于 2020-5-18 15:50
这是一个函数的递归,就是函数自己调用自己
这个例子的结果最终会返回 1(假设不考虑非负整数,如果是 ...
test(n-1) +2 是不是好点。
主要我想问的是这个n-1该怎么理解,只是单纯的传入参数-1吗。
如果传入的参数是4,返回值是7,就是不理解这个计算过程。。 学习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 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: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) sunrise085 发表于 2020-5-18 16:07
递归函数,就是自己调用自己
最深层次的递归是返回一个确切值,不再需要递归调用
这个例子不是很好,如果else 返回的是test(n-1) +2传参4,返回的是7该怎么理解。 本帖最后由 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)
学习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,也就永远拿不到钥匙,是一个死循环,而且递归的话电脑需要记住一个一个房间的名字,这样的话如果层数太多,他就要花大量的内存去记住它,效率就会下降 学习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 Twilight6 发表于 2020-5-18 16:15
这边从最后的test开始返回
test最后一次递归时候return的值是1
看了你的解释我理解了。n就是递归的次数,我的列子传入3的话就等于1+2+2+2。 sunrise085 发表于 2020-5-18 16:19
很难理解吗?
把我刚刚写的那段中,函数调用返回时的+号后面的1改为2,不就得到结果了吗?
看了12楼的我理解是n为递归的次数,传入3就相当于1+2+2+2,没错吧。 学习boy123 发表于 2020-5-18 16:27
看了12楼的我理解是n为递归的次数,传入3就相当于1+2+2+2,没错吧。
n是不是递归次数要看你代码而定的 Twilight6 发表于 2020-5-18 16:30
n是不是递归次数要看你代码而定的
我明白的,我说的只是举例代码这样理解,具体还要看代码的条件。 学习boy123 发表于 2020-5-18 16:32
我明白的,我说的只是举例代码这样理解,具体还要看代码的条件。
嗯嗯 加油继续学习吧! 学习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