|
发表于 2017-8-10 13:09:38
|
显示全部楼层
刚入坑编程 写的代码简直要多长有多长 先贴代码:
#青蛙跳级问题 青蛙一次可以跳一级 也可以跳两级 求n级阶梯有多少种跳法 结果是菲波那切数列
a=[]
b=[]
def allcombine(n,k1,k2):
'求二元一次方程k1*x+k2*y=n的解'
x=k1
y=k2
global a
global b
a=[]
b=[]
for i in range(n+1):
if (n-x*i)%y==0:
a.append(i)
b.append(int((n-x*i)/y))
#print(a)
#print(b)
def factorial(n):
'求n的阶乘'
if n==0:
return 1
else :
return n*factorial(n-1)
def red_white_ball(m,n):
'求m个红球n个白球排成一排的总的排法数'
return int(factorial(m+n)/factorial(m)/factorial(n))
def frog_ladder(n):
result=0
#n=input('请输入正整数n\n')
#flag=n.isnumeric()
if 1:
n=int(n)
allcombine(n,1,2)
print('阶梯级数',n)
print('跳一级的次数',a)
print('跳两级的次数',b)
# print(factorial(n))
else:
print('输入错误!')
for i in range(len(a)):
result+=red_white_ball(a[i],b[i])
#print('跳法的总数',result)
return result
for i in range(12):
print('总的跳法',frog_ladder(i))
说解题思路 先求解x+2y=n 的一次方程,得到所有跳法的组合,存到列表a[]b[]中,再把跳一级看做是一类,跳2级是另一类,即转换为m个红球n个白球排成一排有多少种排法的问题, 最后将所有组合类型的可能加起来,确实是斐波那契数列,结果如下:
阶梯级数 0
跳一级的次数 [0]
跳两级的次数 [0]
总的跳法 1
阶梯级数 1
跳一级的次数 [1]
跳两级的次数 [0]
总的跳法 1
阶梯级数 2
跳一级的次数 [0, 2]
跳两级的次数 [1, 0]
总的跳法 2
阶梯级数 3
跳一级的次数 [1, 3]
跳两级的次数 [1, 0]
总的跳法 3
阶梯级数 4
跳一级的次数 [0, 2, 4]
跳两级的次数 [2, 1, 0]
总的跳法 5
阶梯级数 5
跳一级的次数 [1, 3, 5]
跳两级的次数 [2, 1, 0]
总的跳法 8
阶梯级数 6
跳一级的次数 [0, 2, 4, 6]
跳两级的次数 [3, 2, 1, 0]
总的跳法 13
阶梯级数 7
跳一级的次数 [1, 3, 5, 7]
跳两级的次数 [3, 2, 1, 0]
总的跳法 21
阶梯级数 8
跳一级的次数 [0, 2, 4, 6, 8]
跳两级的次数 [4, 3, 2, 1, 0]
总的跳法 34
阶梯级数 9
跳一级的次数 [1, 3, 5, 7, 9]
跳两级的次数 [4, 3, 2, 1, 0]
总的跳法 55
阶梯级数 10
跳一级的次数 [0, 2, 4, 6, 8, 10]
跳两级的次数 [5, 4, 3, 2, 1, 0]
总的跳法 89
阶梯级数 11
跳一级的次数 [1, 3, 5, 7, 9, 11]
跳两级的次数 [5, 4, 3, 2, 1, 0]
总的跳法 144 |
评分
-
查看全部评分
|