1. 程式人生 > >八大演算法思想(二)------------------遞推演算法

八大演算法思想(二)------------------遞推演算法

一,遞推演算法概述:

和列舉演算法http://blog.csdn.net/qq_32211827/article/details/72970404相比,遞推演算法就比較“聰明”了,遞推演算法能通過已知某個條件,利用特定的關係得出中間推論,然後逐步遞推,直到得到結果為止。由此可見,遞推演算法要比列舉演算法“聰明”,它不會"一根筋"的尋找每一種可能方案。

(1)順推法:從已知條件出發,逐步推算出要解決的方法。例如裴波那契數列就可以通過順推法不斷推算出新的資料。

(2)逆推法:從已知的結果出發,用迭代表達式逐步推算出問題開始的條件,即順推法的逆過程。

裴波那契數列可以說是典型的遞推演算法:

斐波那契數列(Fibonacci sequence),又稱

黃金分割數列、因數學家列昂納多·斐波那契

(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:

1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞迴的方法定義:F(0)=0,

F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

斐波那契數列又因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”。

這是一個有趣的古典數學問題:有一對兔子,從出生後第三個月起每個月都生一對兔子,小兔

子長到第三個月後每個月又生一對兔。假設所有兔子都不死,問每個月的兔子總數為多少?

推法:從已知的結果

依次類推可以列出下表:
經過月數 0 1 2 3 4 5 6 7 8 9 10 11 12
幼仔對數 1 0 1 1 2 3 5 8 13 21 34 55 89
成兔對數 0 1 1 2 3 5 8 13 21 34 55 89 144
總體對數 1 1 2 3 5 8 13 21 34 55 89 144 233

二,Fibonacci數列的實現:

/*************************************************************************************************************************
*檔案說明:
*       Fibonacci數列實現
*開發環境:
*        Win10+VS2015+OpenCv3.2.0
*時間地點:
*        陝西師範大學.文津樓 2017.6.10
*作者資訊:
*        李Sir
**************************************************************************************************************************/
#include<stdio.h>
#include<Windows.h>
int main()
{
	int fib[20] = { 1,1 };				//定義一個數組,預設前兩個月的兔子數各位一對
	for (int i = 2; i < 20; i++)		//計算前20個月每個月的兔子對數    
	{
		fib[i] = fib[i - 1]+fib[i - 2];	//每個月的兔子對數是前兩個月兔子對數的總和
	}
	for (int i = 0; i < 20; i++)		//按照一定的格式輸出前二十個月的個數對數
	{
		printf("第%d個月的兔子數為:%d\n", i, fib[i]);
	}

	system("pause");
	return 0;
}


三,舉一反三:銀行存款問題
母親為兒子Frank的四年大學學費準備了一筆存款,方式是整存零取,規定Frank每月月底取下一個月的生活費。 現在假設利率為1.71%,編寫程式,計算母親最少需要存多少錢? 可以採用逆推法分析存錢和取錢的過程,因為按照月為週期取錢,所以共四年48個月,並分別對每個月進行計 算。如果在第48個月後sun大學畢業時連本帶利要取1000元,這要求出前47個月時銀行存款的錢數。 (1)第47月月末存款=1000(1+0.0171/12) (2)第46月月末存款=(47月月末存款+1000)/(1+0.0171/12) (3)第45月月末存款=(46月月末存款+1000)/(1+0.0171/12) (4)第44月月末存款=(45月月末存款+1000)/(1+0.0171/12) ................... (47)第2月月末存款=(第三個月月末存款+1000)/(1+0.0171/12) (48)第1月月末存款=(第二個月月末存款+1000)/(1+0.0171/12)
/*************************************************************************************************************************
*檔案說明:
*       Fibonacci數列實現
*開發環境:
*        Win10+VS2015+OpenCv3.2.0
*時間地點:
*        陝西師範大學.文津樓 2017.6.10
*作者資訊:
*        李Sir
**************************************************************************************************************************/
#include<stdio.h>
#include<Windows.h>

#define FETCH 1000        //每個月要取的金額(第48個月要取的金額)
#define RATE 0.0171
int main()
{
	double corpus[49];
	int i;
	corpus[48] = (double)FETCH;
	for (i = 47; i > 0; i--)
	{
		corpus[i] = (corpus[i + 1] + FETCH) / (1 + RATE / 12);
	}
	for (i = 48; i > 0; i--)
	{
		printf("%d月月末本利共計:%.2f\n", i, corpus[i]);
	}
	system("pause");
	return 0;
}


相關推薦

八大演算法思想------------------演算法

一,遞推演算法概述: 和列舉演算法http://blog.csdn.net/qq_32211827/article/details/72970404相比,遞推演算法就比較“聰明”了,遞推演算法能通過已

演算法學習Top K 演算法問題

參考學習結構之法,演算法之道 上次談論了尋找最小的k個數問題,如果反過來就是尋找最大的k個問題了。 Top K 題目描述:輸入n個整數,輸出其中最大的k個數 例如輸入1,2,3,4,5,6,7這個7個數,最大的三個數為5,6,7. 這和尋找最小的k

資料結構與演算法--

遞迴條件: 1.遞迴條件:每次調自己,然後記錄當時的狀態 2.基準條件:執行到什麼時候結束遞迴,不然遞迴就會無休止的呼叫自己, 遞迴的資料結構:棧(先進先出)和彈夾原理一樣,每一次呼叫自己都記錄了當時的一種狀態,然後把這種狀態的結果返回。 棧相對應的資料結構:佇列(先進後出

八大演算法思想------------------列舉演算法

#include<iostream> int main() { int j, i[5]; // 迴圈變數,陣列i用來表示4個運算子 int sign; // 累加運算時的符號; int result; // 儲存運算式子的結果值 int count=0; // 計數器,統計符

基於深度學習的目標檢測演算法綜述截止20180821

參考:https://zhuanlan.zhihu.com/p/40020809 基於深度學習的目標檢測演算法綜述分為三部分: 1. Two/One stage演算法改進。這部分將主要總結在two/one stage經典網路上改進的系列論文,包括Faster R-CNN、YOLO、SSD等經

資料結構和演算法緒論

1、演算法概念 不同的演算法可以提高計算相同算術題的效率,那麼演算法的研究就變得有意義了。 2、演算法的特性 輸入 輸出 有窮性(執行有限的步驟) 確定性(每一個步驟僅有一個含義) 可行性 3、演算法設計要求 沒有無法錯誤、有合法輸入和輸出 4、演算法效率 度量方法: 事前分析估算方法

貝葉斯思想

再訪拼寫糾正 介紹了貝葉斯拼寫糾正之後,接下來的一個自然而然的問題就來了:“為什麼?”為什麼要用貝葉斯公式?為什麼貝葉斯公式在這裡可以用?我們可以很容易地領會為什麼貝葉斯公式用在前面介紹的那個男生女生長褲裙子的問題裡是正確的。但為什麼這裡? 為了回答這個問題,一個常見的思路就是想想:

tarjan演算法入門——無向圖的雙連通分量未完成

一.雙連通分量. 無向圖的雙連通分量分為兩種,一種是點雙連通分量,簡稱v-DCC;一種是邊雙連通分量,簡稱e-DCC. 一個v-DCC的概念即為一張沒有割點的圖,一個e-DCC的概念即為一張沒有割邊的圖. 一張極大雙連通分量子圖的是指沒有一張雙連通分量子圖完全包含這張子圖的所有點且點

系統學習機器學習之總結--機器學習演算法比較

轉自:https://blog.csdn.net/bryan__/article/details/52026214 其實這篇文章真正出處來自:csuldw 本文主要回顧下幾個常用演算法的適應場景及其優缺點! 機器學習演算法太多了,分類、迴歸、聚類、推薦、影象識別領域等等,要想找到一個合適演算

【百度】大型網站的HTTPS實踐——HTTPS加密演算法介紹

大型網站的HTTPS實踐(二)——HTTPS加密演算法介紹 原創 網路通訊/物聯網 作者:AIOps智慧運維 時間:2018-11-09 15:09:43  358  0   前言

計算機圖形學實驗—— 直線Bresenham演算法原始碼

 1. Bresenham演算法核心:(詳細原理見末尾) 理解光柵化:畫素點只能是整數點。 藉助決策變數 的正負號判斷下一個點座標,從而避免了計算直線斜率所用乘除法,只需要用加減法。 預設斜率絕對值在區間(0,1)時,即abs(dx)>abs(dy),步進方

資料結構與演算法筆記複雜度分析

2. 複雜度分析 2.1 什麼是複雜度分析 資料結構和演算法的本質:快和省,如何讓程式碼執行得更快、更省儲存空間。 演算法複雜度分為時間複雜度和空間複雜度,從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 複雜度描述的是演算法執行時間(或佔用空間)與資料規模的增長關

演算法訓練

1.zoj-4026 首先我們需要推倒一下,每次都是從A開始拿,可以列舉幾種情況,會發現最後結束一定是在第四次抽到A的時候結束的,因為假設在第二堆結束,你在抽完4次2後第二堆才為空,你需要第五次抽到2才會回到第二堆,這時候才能結束,不符合題意,因此只有第一次就被抽的A能結束遊戲,因此結束的時

GIS演算法基礎計算幾何基礎

地理資料在計算機中表示大致分為兩種,向量資料和柵格資料。 要計算地理資料的空間關係,一般是向量資料之間的比較。例如:點,線,面之間的比較。 如何判斷線段之間是否相交,線段與面的包含關係。點與面的包含關係等等這些空間關係,都用到計算幾何的演算法。   空間關係的判定演算法的內

基於深度學習的目標檢測演算法綜述

前言 基於深度學習的目標檢測演算法綜述分為三部分: 1. Two/One stage演算法改進。這部分將主要總結在two/one stage經典網路上改進的系列論文,包括Faster R-CNN、YOLO、SSD等經典論文的升級版本。 2. 解決方案。這部分論文對物體檢

排序演算法選擇排序

原理: 每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法。 思路: n個數進行n-1次排序 每一次排

演算法訓練營:堆排序

堆排序過程 建立大頂堆或者小頂堆,大頂堆(一種二叉樹型結構,子樹節點值都小於父節點的值)。這個過程的要點是:先從最後一個非葉子節點開始構建堆,因為最後一個非葉子節點才有可能需要調整,然後向前查詢的節點都有子樹,都有可能需要調整。 排序過程。建立好了大頂堆,那麼第一個節

Java程式設計思想第14章-型別資訊

目錄: 1. RTTI(Runtime Type Identification)執行階段型別識別 1.1 用途:   為了確定基類指標實際指向的子類的具體型別。——《C++ Primer Plus》 1.2 工作原理:   通過型別轉換運算子回答“是否可以

【精選】JAVA入門演算法

時時要有危機意識。別以為你命好運也好。 1.題目:打印出所有的 水仙花數 ,所謂 水仙花數 是指一個三位數,其各位數字立方和等於該數本身。 例如:153是一個 水仙花數 ,因為153=1的三次方+5的三次方+3的三次方。 題非常簡單,只要用for迴圈,取出數的個位、十位

演算法蓄水池抽樣演算法快速隨機抽取reads

原創:hxj7 關鍵詞:蓄水池演算法; fastq檔案往往都很大,出於測試目的,我們經常要從fastq檔案中隨機抽取reads,生成一個小一點的fastq檔案,以加快測試效率。假設我們要從一個包含大約100M reads的fastq檔案中隨機抽取1M reads