小甲鱼22递归是神马
def factorial(n):if n == 1:
return 1
else:
return n * factorial(n-1)
number = int(input('请输入一个正整数'))
result = factorial(number)
print('%d 的阶乘是:%d' % (number,result))
看小甲鱼的视频没明白
问题1:在函数里面的else条件,返回 的是n * factorial(n-1)的值,例如n = 5,n * factroial(n-1),每一次调用自身函数n的值都会减1,
那么当n的参数为1的时候,if条件就成立了,if条件里面是return 1,返回1的同时这个函数也执行完毕了。然而返回的不是1。
问题2:n * factorial(n - 1)的积数为什么会赋值给result,result在进入函数之前不是定义为调用这个函数吗,但是当格式化输出result的时候为什么会得到数值?
这个递归的原理是这样的:return n * n - 1 * n - 1 - 1 * n - 1 - 1......一直到n等于1,最后把他们相乘的值返回给result。 函数调用,在哪里调用就返回到哪里。
你的想法中,只有调用,没有返回啊。。
n=5,递归五次,有点多了,给你说一下n=3的吧
n=3,程序执行到 result = factorial(number)
第一次调用 factorial(n),n=3,if判断,执行else下面的语句,return 3 * factorial(2),这是发现需要递归调用
第二次调用 factorial(n), n=2,if判断,执行else下面的语句,return 2 * factorial(1),这是发现需要递归调用
第三次调用 factorial(n), n=1,if判断,执行if下面的语句,return 1,然后返回到调用的位置,即第二次调用的return语句处
第二次调用的return处,return 2*1,即return 2,返回到第一次调用的return处
第一次调用的return处,return 3*2,即return 6,返回到第一次处
得到 result=6 sunrise085 发表于 2020-9-5 23:07
函数调用,在哪里调用就返回到哪里。
你的想法中,只有调用,没有返回啊。。
没有太理解你说的:n=1,if判断,执行if下面的语句,return 1,然后返回到调用的位置,即第二次调用的return语句处
第二次调用的return处,return 2*1,即return 2,返回到第一次调用的return处
第一次调用的return处,return 3*2,即return 6,返回到第一次处
我想的是函数的参数最后都会为1,那么最终函数都会进入if条件里面返回1,同时跳出这个函数,然后执行print函数,函数最后返回的1,那么result不应该是1吗,想不通result的返回却是else条件里面的返回值
qin_yin 发表于 2020-9-5 23:46
没有太理解你说的:n=1,if判断,执行if下面的语句,return 1,然后返回到调用的位置,即第二次调用的ret ...
这样能理解么? 疾风怪盗 发表于 2020-9-5 23:56
这样能理解么?
你想表达的意思是看明白了,但是我不懂if == 1,return 1,这个1是起个什么作用,return 1 了之后为什么不是跳出这个函数(这里没有调用函数啊),而是按照你以上图的流程来执行了 n = 3 和 n = 2 的时候在 else 里调用的 factorial 函数,
在最后一次 n = 1,进入了 if 语句,return 1 将 1 返回到 n = 2 时调用的 factorial 函数,
然后 以此类推 本帖最后由 sunrise085 于 2020-9-6 09:23 编辑
但是我不懂if == 1,return 1,这个1是起个什么作用,return 1 了之后为什么不是跳出这个函数(这里没有调用函数啊)
今天早上我还在想这个问题呢。正打算找时间写个帖子,帮助你们这一类人解释一下这个问题。
你们的想象力不够,每次函数调用都需要返回,在哪里调用的函数就返回到哪里
就像5楼画的这个图一样,当n=3和n=2的时候,都有再次调用此函数,因此返回的时候还是在此函数中,但是实际上是返回了。
举个实际的例子。
现在要你去一个深宅大院取回来一个东西,给了你一串钥匙(实际就是n初值3),然后到了大院门口,开始打开院子大门(第一次调用函数);向里走了几步又遇到一个门,开始打开第二把锁(第二次调用);在向里走一段看到了房间门,开始打开房间的锁(第三次调用),在房间里你拿到了东西。这就完事儿了吗?没有!因为你现在还在大院的一个房间里(在第三次调用的函数里),你还需要向外走,逐个把门都锁上(逐层返回),回到大院外面去。这样才算完成了 qin_yin 发表于 2020-9-6 02:03
你想表达的意思是看明白了,但是我不懂if == 1,return 1,这个1是起个什么作用,return 1 了之后为什么不 ...
这个图应该很清楚了吧,我也不懂你为什么不懂
return就是跳出函数,给一个返回值
if n == 1 return 1,就是跳出了这个函数,返回1,把1给到上一层函数
上一层函数计算下返回值,再跳出这个函数,返回2,把2给到上一层函数
上一层函数计算下返回值,再跳出这个函数,返回6,已经到顶层了,就直接出返回值了
这不是很简单的么
没有说过一个return就直接跳出全部函数,都是一层一层跳的 我看了几段视频,我说下我的理解吧,当执行到result = factorial(number),(假设给的参数是4),调用函数,判断函数参数是否等于 1,等于1就返回 1,返回result这个变量(factorial这个函数),不等于1执行else条件,即返回factorial(number- 1) * number(即factorial(3) * 4,)这里在调用了函数的参数 - 1 * 3的同时候也调用函数,然后又进入到factorial(3),if判断,成立返回1,不成立factorial(number - 1) * 3,即(factorial(2) * 3)同理调用函数参数的 - 1 * 3的同时也调用函数,又进入到factorial(2),现在number还是不等于所以,factorial(2 - 1) * 2,由此类推,直到if条件成立返回1,退出函数,结果为:1*2*3*4的积,怎么说呢,递归有点抽象,用文字表达,程序在第一次返回其实就已经返回结果,返回的返回值里面又包含了另一个返回值,另一个返回值又返回了另一个返回值,直到返回值1为 递归视频讲解https://v.qq.com/x/page/i0854csthuq.html?
页:
[1]