python 递归 return (n == 1 or n == 2) and 1 or (digui(n-1) + digui(n-2))是什么意思?

有一楼梯共n级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第n级,共有多少种走法?
现在给你一个正整数n(0<n<40),请你输出不同的走法数。

def digui(n):
return (n == 1 or n == 2) and 1 or (digui(n-1) + digui(n-2))
print digui(n)

此程序可改写为:

def digui(n: int) -> int:
    if n ==1 or n == 2:
        return 1
    else:
        return digui(n - 1) + digui(n - 2)

对于主程序语句

return (n == 1 or n == 2) and 1 or (digui(n - 1) + digui(n - 2))

来说,它由被or分隔开的两个语句构成。首先or左边的语句

return (n == 1 or n == 2) and 1

此语句相当于使用if条件语句做的一个基本条件,即用来终结递归语句的进行,防止无限递归的发生。相当于:

if n == 1 or n == 2:
    return 1

意思是当楼梯只有一层或两层时,直接输出1,因为只有一种走法(1层时原地不动,2层时只能向上走一步)。


然后or右边的语句

or digui(n - 1) + digui(n - 2)

这句中的or相当于if语句中的

else:

即若不属于

n == 1 or n == 2

的情况时,开始执行如下递归步骤,步骤为

digui(n - 1) + digui(n - 2)

这里要有一个递归思想,假设有n阶楼梯,走第一步时只有两种选择,要么跨两阶要么跨一阶,那么:

    第一步跨一阶:

    那么此时还剩(n - 1)阶楼梯,这n - 1阶的跨楼方法自然变成digui(n - 1)

    第一步跨两阶:

    那么此时还剩(n - 2)阶楼梯,这n - 2阶的跨楼方法自然变成digui(n - 2)

    所以对于n阶楼梯来说,总共的跨楼方法是

digui(n - 1) + digui(n - 2)

    种。

    对于n - 1或n - 2级楼梯来说,他们各自又会有

digui(n - 1) + digui(n - 2)   # 注意这里的n代表的是的n - 1或者n - 2,而不是                               # 最初的n。

   种方法,如此循环下去,便形成了一个递归,直到楼梯数目n减为1或者2时,进入基本条件,递归终止。


说句题外话,其实此问题就是一个斐波那契数列的应用,抽象成数学问题就是:

有斐波那契数列 1,1,2,3,5,8,13,21,……  从第三个数开始,每个数都是前两个数之和,求第n个数的值。

如果变成这样的问题可能更好思考一些。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-08-23
n级楼梯,第一步可以跨一或二级,还有n-1或n-2级楼梯,总的走法为n-1楼梯的走法加上n-2阶楼梯的走法,即digui(n-1)+digui(n-2)
这个程序当n==1或n==2时直接返回1,
return (n == 1 or n == 2) and 1 or (digui(n-1) + digui(n-2))
简化为a and b or c,当a成立时返回 b的值,(n==1 or n==2)成立时返回1,a and b不成立时返回c的值,(n==1 or n==2)不成立时返回(digui(n-1)+digui(n-2))的值

def digui(n):
if n == 1 or n == 2:
return 1
else:
return digui(n-1) + digui(n-2)
而且这个程序根本就不对,2级楼梯可以一次走一级,也可以 一次走二级,有两种走法,这个程序 会返回 1,if n==1 or n==2:retun n 当n=2时会返回2这样才对
走楼梯应该是从第0级开始,如果一开始就在第一级上就要先减一级print digui(n-1)追问

谢谢,不过只能采纳一个答案,所以……
你考虑得很周到,是我的疏忽,其实原题中还有一句话我没复制:
如n=2,则输出1(你只有一种走法,走一步,从第一级到第二级)

追答

原题就是求n-1阶楼梯的走法
def digui(n):
return n if n<=2 else digui(n-1)+digui(n-2)
print digui(n-1)
这个程序和你给出的程序结果基本一致,除了n==1,人在第一级楼梯上原地不动应返回 0
我说的是最后还剩下两级楼梯时有两种走法,你那个程序少算了一次digui(n-2),结果就是digui(n)-digui(n-2)=digui(n-1),但不能作出一个比较直观的解释。
对别人已经说过的意思进行“艺术加工"居然能算专业,呵呵

相似回答