刷题遇到了青蛙跳台阶,,,用到了斐波那契,,顺便从笔记上整理下。
版本1
这个写起来很爽,用起来就很操蛋了,,效率太低,
def fib(n):
if n == 1 or n == 2:
return 1
return fib(n-1) + fib(n-2)
版本2
这个写得就很巧妙了,
def fib(n, l=[0]):
l[0] += 1
if n == 1 or n == 2:
l[0] -= 1
if l[0] == 0:
return 1
return 1, 1
else:
a, b = fib(n-1)
l[0] -= 1
if l[0] == 0:
return a+b
return b, a+b
def fib(n):
l1 = [1, 1]
for i in range(n-2):
l1.append(l1[-2]+l1[-1])
return l1
描述:
一只青蛙一次可以跳上1级台阶,也可以一次跳2级台阶。求该青蛙跳上n级台阶总共有多少种跳法。
当了解到这道题和斐波那契数列有关系, 我真是一脸懵逼,,????
这只青蛙打算一共跳n级台阶
不过这个斐波那契是变形的斐波那契,1,2,3,5,8……
fib = lambda n: n if n <= 2 else fib(n-1) + fib(n-2)
print(fib(5))
再不就这样
def fib(n):
if n <= 2:
return n
else:
return fib(n-1) + fib(n-2)
换汤不换药,一个东西。
这只青蛙吔屎了,自大了, 一次能跳n级台阶,,,求这只青蛙跳上n级台阶有几种方法。
所以代码
fib = lambda n: n if n < 2 else 2 * fib(n-1)
print(fib(4))
描述: 我们可以用2*1的小矩形横着或竖着去覆盖更大的矩形。请问用n个2*1的小矩行无重复地覆盖一个2*n地大矩形,总共有多少种方法?
这其实又是斐波那契的变种,(最晚都写完了,好像忘记保存了,,草稿箱也没提有,)
fib = lambda n: n if n <= 2 else fib(n-1) + fib(n-2)
在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
(这个题目就是让你输入一个杨氏矩阵,然后在输一个数,看看在不在里面,不要多想,而且保证自己输入正确, 不要给自己找麻烦)
def get_value(l, r, c):
return l[r][c]
def find(l, x):
m = len(l) - 1 # 行数
n = len(l[0]) - 1 # 列数
r = 0 # 默认从0行开始
c = n # 默认从最后一列开始
while c >= 0 and r <= m:
value = get_value(l, r, c)
# 从右上的数开始
if value == x:
return True
elif value > x:
# 所选值大于x, 列数-1,因为这一行前面的数都别value小
c = c - 1
elif value < x:
# 所选值小于x, 行数+1, 因为这一列下面的数都比value大
r = r + 1
return False
print(find([[1,4,7,11,15], [2,5,8,12,19], [3,6,9,16,22], [10,13,14,17,24], [18,21,23,26,30]], 9))