题目:计算阶乘 n!=1*2*3*4*5*...*n的和

先看一个简单的方法

def jiecheng(n):    #定义一个函数jiecheng(n) 要计算几的阶乘就输入几
    s=1             #给s定义一个变量的值为1
    for i in range(1,n+1):    #写一个for循环让他对列表里的值进行遍历
        s = s*i            #每次得到的i的新值和s进行相乘等到一个新的s 
    return s    #返回s的值

print(jiecheng(4))    #打印n为4的阶乘

解题思路:把需要求的n的值弄到for循环中,这样就能得到1-n的值了,然后再定义一个值s,让每次相乘后的新值,给的定义的变量s中,这样就可以让每次得到的结果进行累乘直到得到最后的结果

第二种方法就是使用递归的思路去解题了

def jiecheng(n):     #定义一个函数jiecheng(n) 要计算几的阶乘就输入几
    if n == 1:       #写一个判断,判断n是不是等于1
        return n     #如果n是1结束循环 返回n的值
    else:            
        return n * jiecheng(n-1)   #否则返回 n*jiecheng(n-1)的值

print(jiecheng(4))   #打印n为4的阶乘

首先简单了解下递归,然后再去对代码进行分析,递归就是指在函数的定义中使用函数自身的方法,在递归中,必须要有一个明确的结束的条件,如果没有结束条件的话,将会一直循环下去。

具体用这道题来讲解下,就先不用n了,我们现在默认把n定义为4,这么理解的话不会太抽象,如果我们要计算1*2*3*4的值,可以理解成我们要计算3!*4就行,这个就对应了上面代码中n(就是上面的4) * jiecheng(n-1)(就是3!)这句话,就是我不管是我要求多少个数,永远都是n * jiecheng(n-1)。

现在看下这个的计算过程。首先写出要计算的值n * jiecheng(n-1),然后确定递归的结束条件,当n=1时,就结束整个递归。

第一步:当n=4时,不满足n=1,走到else的分支里,应该输出 4*jiecheng(4-1) ,但是还不知道jiecheng(4-1)的值,于是我们要求jiecheng(4-1)的值就是jiecheng(3)的值。

第二步:计算函数jiecheng(3),首先当n=3时,不满足n=1,走到else的分支里,应该输出 3*jiecheng(3-1) ,但是还不知道jiecheng(3-1)的值,于是我们要求jiecheng(3-1)的值就是jiecheng(2)的值。

第三步:计算函数jiecheng(2),首先当n=2时,不满足n=1,走到else的分支里,应该输出 2*jiecheng(2-1) ,但是还不知道jiecheng(2-1)的值,于是我们要求jiecheng(2-1)的值就是jiecheng(1)的值。

第四步:计算函数jiecheng(1),首先当n=1时,满足该条件,于是,输出结果n为1,结束递归的循环,所以函数jiecheng(1)的值就为1

第五步:现在要往回开始计算了,因为知道了jiecheng(1)的值,所以第三步jiecheng(2)的值就知道了。2*jiecheng(1)=2*1=2,所以函数jiecheng(2)的值就为2.

第六步:现在再往回计算,因为知道了jiecheng(2)的值,所以第二步jiecheng(3)的值就知道了。3*jiecheng(2)=3*2=6,所以函数jiecheng(3)的值就为6

第七步:现在再往回计算,因为知道了jiecheng(3)的值,所以第一步jiecheng(4)的值就知道了。4*jiecheng(3)=4*6=24,所以函数jiecheng(4)的值就为24

用我自己的理解就是,计算递归就是一个向下计算和一个往回计算的过程,我们要根据函数一步一步的执行,直到达到了结束条件,然后得到结束结束条件后,再一步一步往回计算去得到最初想要结果。可以理解为,我们要去侦破一个案件,我们刚开始有很多谜题,每个环节都有关联,我们需要根据证据一步一步推理,得到最后的答案,然后在根据答案,再一步一步的反推去印证之前的推理是否正确,可以看个这个例子,就是宝贝在第四个房间中,然后我进到房间后门就会自己关闭。

Python k的阶乘 python求阶乘n!_for循环

第一步:我们要打开第一个房间的门,进入到第二个房间,这时候第一个房间的门就关上了

第二步:打开第二个房间的门,进入到第三个房间,这时候第二个房间的门就关闭了

第三步:打开第三个房间的门,进入到第四个房间,这时候我们拿到宝贝后,第三个房间的门就又关了

第四步:我们去打开第三个房间的门,回到第三个房间后,这时候第三个房间的门关上了

第五步:我们去打开第二个房间的门,回到第二个房间后,这时候第二个房间的门关上了

第六步:我们去打开第一个房间的门,回到第一个房间后,这时候第一个房间的门关上了

最后我们成功拿到啦宝物,这里面第一步最初打开房间的门就是最初调的函数,然后去拿宝物的途中打开的门就是一次一次调的内部函数,拿到宝贝回到第一个房间后就是我们的最终答案,第四个房间放宝贝,这个就是递归的结束条件,假设我们拿不到宝贝不能回去,然后有无数扇门,如果我们忘了往里面放宝贝了,我们就会无限制的往后开门,永远结束不了这个循环了。

        这个就是我理解的递归函数的概念,首先一定要有一个结束的条件,其次就是要在函数里,能再次调用本函数,就是我们一直往前调用该函数,直到走到了结束条件那个语句,然后我们就开始拿着答案一步一步的再往回计算。

         递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。递归的算法代码简洁,容易验证正确性,但是它的运行需要较多次数的函数调用,会影响执行效率,占用过多内存,再能使用循环去解决问题的情况下,还是优先考虑循环的方法。