遞迴問題現在一直有些不理解……
遇到的題記錄下來
1:遞迴演算法的思想生小兔子問題遞迴演算法是把問題轉化為規模縮小了的同類問題的子問題。然後遞迴呼叫函式(或過程)來表示問題的解。在c語言中的執行堆疊為他的存在提供了很好的支援,過程一般是通過函式或子過程來實現。
遞迴演算法:在函式或子過程的內部,直接或者間接地呼叫自己的演算法。
2:遞迴演算法的特點:
遞迴演算法是一種直接或者間接地呼叫自身演算法的過程。在計算機編寫程式中,遞迴演算法對解決一大類問題是十分有效的,它往往使演算法的描述簡潔而且易於理解。
遞迴演算法解決問題的特點:
(1) 遞迴就是在過程或函式裡呼叫自身。
(2) 在使用遞迴策略時,必須有乙個明確的遞迴結束條件,稱為遞迴出口。
(3) 遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低。所以一般不提倡用遞迴演算法設計程式。
(4) 在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等。所以一般不提倡用遞迴演算法設計程式。
3:遞迴演算法的要求
遞迴演算法所體現的「重複」一般有三個要求:
一是每次呼叫在規模上都有所縮小(通常是減半);
二是相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸出就作為後一次的輸入);
三是在問題的規模極小時必須用直接給出解答而不再進行遞迴呼叫,因而每次遞迴呼叫都是有條件的(以規模未達到直接解答的大小為條件),無條件遞迴呼叫將會成為死迴圈而不能正常結束。
有一對小兔子,從出生後第3個月起每個月都生一對兔子。
小兔子長到第3個月後每個月又生一對兔子。按此規律,
假設沒有兔子死亡,第乙個月有一對剛出生的小兔子,
問第n個月有多少對兔子?
經過推算發現是fibonaci(斐波那契)數列:1,1,2,3,5,8,13,21,34,55,89,144,…… 從第三項起都是前兩項的和
然後可以寫了
hduoj2018
有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請程式設計實現在第n年的時候,共有多少頭母牛?
前4年只有母牛在生所以是+1,第五年多了頭母牛就是+3,然後可以倒著想第n年的牛是由前一年所有的牛和今年新生的牛組成的,今年能生的一定是4年前的牛即n-3年的牛。
#include
using
namespace
std;
int run(int a)
int main()
int main()
int main()
}
演算法遞迴 集合的全排列問題
設集合 r 顯然全排列的數目為 n!那麼如何顯示集合的所有全排列呢?可以用遞迴的方式實現。解題思路 如果集合有n個元素,那麼就可以看作 n 1個元素全排列之後再加上 剩下的那個元素,因為是全排列,所以每乙個元素都會剩下一次。例如 r 的全排列。若 1 剩下,則 先進行排列,再與1結合,結果是 1 2...
集合劃分(遞迴演算法)
問題描述 n個元素的集合可以劃分為若干個非空子集。例如,當n 4 時,集合可以劃分為15 個不同的非空子集如下 給定正整數n,計算出n個元素的集合可以劃分為多少個不同的非空子集。其中設q n,m 表示n個數可以表示為m個非空子集。根據m和n的關係,可以分為以下情況 第一種情況 n 1時,只有乙個元素...
集合的劃分 遞迴
題目描述 設s是乙個具有n個元素的集合,s 現將s劃分成k個滿足下列條件的子集合s1,s2,sk,滿足 1 si 2 si sj 1 i,j k i j 3 s1 s2 s3 sk s 則s1,s2,sk是集合的乙個劃分。它相當於把s集合中的n個元素a1,a2,an放入k個 0 k n 30 無標號...