面試題10:斐波那契數列
題目一:
寫乙個函式,輸入n,求斐波那契數列的第n項。
定義:
(分段函式)
f(n)= 0 if n=0
f(n) = 1 if n=1
f(n) = f(n-1) + f(n-2) if n>1
可用遞迴的方式,但在遞迴呼叫層級太多時,會導致呼叫棧溢位,且在此題中,遞迴方法有很多重複的計算
使用自下而上的迴圈實現**
public class q10
public static long fibonacci(int n) else
return f1;
} }}
擴充套件:矩形覆蓋——用8個2×1的小矩形無重疊地覆蓋乙個2×8的大矩形,總共有多少種方法
先把2×8的覆蓋方法記為f(8),用第乙個1×2的小矩形去覆蓋大矩形的最左邊時,有兩個選擇(橫/豎)
當豎著放時,右邊還剩2×7的區域,此時記為f(7)
當橫著放時:若放在左上角,則右下角必須也橫著放乙個1×2的小矩形,此外還剩乙個2×6的區域,記為f(6)
因此f(8) = f(7) + f(6)
可看出,此時依舊是斐波那契數列
擴充套件部分:
1. 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。
斐波那契數列
2. 乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。
方法:
用f(n)表示青蛙跳上n階台階的跳法數,青蛙一次性跳上n階台階的跳法數,
f(0)=1;
當n = 1時,只有一種跳法,即1階跳:f(1) = 1;
當n = 2時,有兩種跳法,一階跳和二階跳:f(2) = f(1)+f(0) = 2;
當n =3時,有三種跳法,第一次跳出一階後,後面還有f(3-1)中跳法;第一次跳出二階後,後面還有f(3-2)中跳法;第一次跳出三階後,後面還有f(3-3)種跳法:f(3)= f(2)+f(1)+f(0) = 4
當n= n時,共有n種跳法方式,第一次跳出一階後,後面還有fib(n-1)種跳法;第一次跳出二階後,後面還有fib(n-2)種跳法,第一次跳出n階後,後面還有fib(n-n)種跳法。
f(n) = f(n-1)+f(n-2)+f(n-3)+……+f(n-n)=f(0)+f(1)+f(2)+…….+f(n-1)
又因為f(n-1)=f(0)+f(1)+f(2)+……+f(n-2)
兩式相減得:f(n)-f(n-1)=f(n-1) → f(n) = 2*f(n-1) n >= 2
遞迴等式如下:
劍指offer第二版 面試題6(java)
面試題6 從尾到頭列印鍊錶 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 鍊錶的結點定義如下 public class listnode 注意 面試中,如果打算修改輸入的資料,最好先問好是否資料是允許修改的 思路 1.遍歷順序從頭到尾,列印順序從尾到頭,第乙個結點最開始被訪問,但是最...
劍指offer第二版 面試題8 java
題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標 分析 情況 一 有右子樹,這時只需要把其右孩子作為下乙個遍歷的 並不是要找的 節點,然後沿著該節點的左子樹 如果有的話 出發,直到遇到葉子節點,那麼該葉子節...
劍指offer第二版 面試題9(java)
面試題9 用兩個棧實現佇列 題目描述 方法 兩個棧 stack1 stack2 插入時,直接放入stack1 刪除時,直接彈出pop2中的物件 如果pop2為空,則先將pop1中的物件放入stack2中,再從stack2裡pop第乙個 如 依次放入stack1中1 2 3,在彈出並放入stack2中...