遞推(一):遞推法的基本思想

? ? ? 所謂遞推,是指從已知的初始條件出發,依據某種遞推關系,逐次推出所要求的各中間結果及最后結果。其中初始條件或是問題本身已經給定,或是通過對問題的分析與化簡后確定。

? ? ? 利用遞推算法求問題規模為n的解的基本思想是:當n=1時,解或為已知,或能非常方便地求得;通過采用遞推法構造算法的遞推性質,能從已求得的規模為1、2、…、i?1的一系列解,構造出問題規模為i的解。這樣,程序可從i=0或i=1出發,重復地由已知至i?1規模的解,通過遞推,獲得規模為i的解,直至獲得規模為n的解。

? ? ? 可用遞推算法求解的問題一般有以下兩個特點: (1) 問題可以劃分成多個狀態; (2) 除初始狀態外,其它各個狀態都可以用固定的遞推關系式來表示。當然,在實際問題中,大多數時候不會直接給出遞推關系式,而是需要通過分析各種狀態,找出遞推關系式。

? ? ? 利用遞推算法解決問題,需要做好以下四個方面的工作:

? ? ? (1)確定遞推變量

? ? ? 應用遞推算法解決問題,要根據問題的具體實際設置遞推變量。遞推變量可以是簡單變量,也可以是一維或多維數組。從直觀角度出發,通常采用一維數組。

? ? ? (2)建立遞推關系

? ? ? ?遞推關系是指如何從變量的前一些值推出其下一個值,或從變量的后一些值推出其上一個值的公式(或關系)。遞推關系是遞推的依據,是解決遞推問題的關鍵。有些問題,其遞推關系是明確的,大多數實際問題并沒有現成的明確的遞推關系,需根據問題的具體實際,通過分析和推理,才能確定問題的遞推關系。

? ? ? ?(3)確定初始(邊界)條件

? ? ? ?對所確定的遞推變量,要根據問題最簡單情形的數據確定遞推變量的初始(邊界)值,這是遞推的基礎。

? ? ? (4)對遞推過程進行控制

? ? ? 遞推過程不能無休止地重復執行下去。遞推過程在什么時候結束,滿足什么條件結束,這是編寫遞推算法必須考慮的問題。

? ? ? ?遞推過程的控制通常可分為兩種情形:一種是所需的遞推次數是確定的值,可以計算出來;另一種是所需的遞推次數無法確定。對于前一種情況,可以構建一個固定次數的循環來實現對遞推過程的控制;對于后一種情況,需要進一步分析出用來結束遞推過程的條件。

? ? ? ?遞推通常由循環來實現,一般在循環外確定初始(邊界)條件,在循環中實施遞推。

? ? ? ?遞推法從遞推方向可分為順推與倒推。

? ? ? ?所謂順推法是從已知條件出發,通過遞推關系逐步推算出要解決的問題的結果的方法。如求斐波拉契數列的第20項的值,設斐波拉契數列的第n項的為f(n),已知f(1)=1,f(2)=1;通過遞推關系式f(n)=f(n-2)+f(n-1) (n>=3,n∈N),可以順推出f(3)=f(1)+f(2)=2、f(4)=f(2)+f(3)=3、…直至要求的解f(20)=f(18)+f(19)=6765。

? ? ? 所謂倒推法,就是在不知初始值的情況下,經某種遞推關系而獲知了問題的解或目標,從這個解或目標出發,采用倒推手段,一步步地倒推到這個問題的初始情況。

? ? ? 一句話概括:順推是從條件推出結果,倒推從結果推出條件。

? ? ? ?順推法是從前往后推,從已求得的規模為1、2、…、i?1的一系列解,推出問題規模為i的解,直至得到規模為n的解。順推算法可描述為:

for (k=1; k<=i?1; k++)

? ? ?f[k]= <初始值>;??????? ?????? // 按初始條件,確定初始值

for (k=i; k<=n; k++)

??? f[k]= <遞推關系式>;? ???? // 根據遞推關系實施遞推

cout<<f[n];?????????????? ??? // 輸出n規模的解f(n)

? ? ? ?倒推法是從后往前推,從已求得的規模為n、n?1、…、i+1的一系列解,推出問題規模為i的解,直至得到規模為1的解(即初始情況)。倒推算法可描述為:

for (k=n; k>=i+1; k--)

? ? ?f[k]= <初始值>;??????? ?????? // 按初始條件,確定初始值

for (k=i; k>=1; k--)

??? f[k]= <遞推關系式>;? ???? // 根據遞推關系實施遞推

cout<<f[1];?????????????? ??? // 輸出問題的初始情況f(1)

? ? ? ?遞推問題一般定義一維數組來保存各項推算結果,較復雜的遞推問題還需定義二維數組。例如,當規模為i的解為規模為1、2、…、i?1的解通過計算處理決定時,可利用二重循環處理這一較為復雜的遞推。

【例1】RPG涂色問題

? ? ? 有排成一行的n個方格,用紅(Red)、粉(Pink)、綠(Green)三種顏色涂每個格子,每個格子涂一種色,要求任何相鄰的方格不能同色,且首尾兩格也不同色。

? ? ? 編寫一個程序,輸入方格數n(0<n<=30),輸出滿足要求的全部涂法的種數。

? ? ? (1) 編程思路

? ? ? 設滿足要求的n個方格的涂色方法數為F(n)。

? ? ? 因為RPG有三種顏色,可以先枚舉出當方格數為1、2、3時的涂法種數。

? ? ? 顯然,? ? ?F(1)=3 ??(即R、P、G三種)

????? F(2)=6? ?(即RP、RG、PR、PG、GR、GP六種)

????? F(3)=6?? (即RPG、RGP、PRG、PGR、GRP、GPR六種)

? ? ? 當方格的個數大于3時,n個方格的涂色方案可以由n-1方格的涂色方案追加最后一個方格的涂色方案得出,分兩種情況:

? ? ? 1)對于已按要求涂好顏色的n-1個方格,在F(n-1)種合法的涂色方案后追加一個方格(第n個方格),由于合法方案的首尾顏色不同(即第n-1個方格的顏色不與第1個方格的相同),這樣,第n個方格的顏色也是確定的,它必定是原n-1個方格的首尾兩種顏色之外的一種,因此,在這種情況下的涂色方法數為F(n-1)。

? ? ? 2)對于已按要求涂好顏色的n-2個方格,可以在第n-1個方格中涂與第1個方格相同的顏色,此時由于首尾顏色相同,這是不合法的涂色方案,但可以在第n個方格中涂上一個合法的顏色,使其成為方格長度為n的合法涂色方案(注意:當n等于3時,由于第1(3-2)個方格與第2(3-1)個方格顏色相同,第3個方格不論怎樣涂都不會合法,因此遞推的前提是n大于3),在第n個方格中可以涂上兩種顏色(即首格外的兩種顏色,因為與它相連的第n-1個方格和第1個方格的顏色是一樣的),因此,在這種情況下的涂色方法數為2*F(n-2)。

由此,可得遞推公式:F(n)= F(n-1) + 2*F(n-2)? (n>=4)

程序中定義3個變量f1、f2和f3分別表示F (n-2)、F(n-1)和F(n),初始時f1=6、f2=6。

當n<4時,根據初始情況直接輸出結果。

當n>=4時,用循環遞推計算F(n)。程序段描述為:

??? for(i=4;i<=n;i++)

??? {

??????? f3=f1+f2;????????? // 計算當前F(i)

??????? f1=f2;?? f2=f3;??? // 為下一次遞推做準備

??? }

? ? ? (2)源程序及運行結果

#include <iostream>

using namespace std;

int main()

{

?? int i,n,f1,f2,f3,num;

?? cout<<"請輸入方格的數目 n (0<n<=30):";

?? cin>>n;????

?? if (n==1)? num=3;

?? else if (n==2 || n==3)? num=6;

?? else

?? {

?????? ?? f1=6;? f2=6;

?????? for(i=4;i<=n;i++)??

?????? ?? {

?????? ?????? f3=2*f1+f2;??? ?????// 遞推求F(i)

????????????? ? ?f1=f2;? f2=f3;?????? // 為下次遞推做準備

?????? ?? }

?????? ?? num=f3;

?? }

?? cout<<n<<"個方格的正確涂色方案一共有"<<num<<"種。"<<endl;

?? return 0;

}

? ? ? 為更清晰地描述遞推過程并保存中間結果,可以定義一個一維數組f[31],數組元素f[i]保存總數為i個方格的涂色方法數。初始值: f[1]=3、f[2]=6、f[3]=6。源程序清單如下。

#include <iostream>

using namespace std;

int main()

{

?? int i,n,f[31];

?? f[0]=0;???

?? f[1]=3;????

?? f[2]=6;???

?? f[3]=6;????

?? for(i=4;i<31;i++)????????

?????? ?? f[i]=f[i-1]+2*f[i-2];????

?? cout<<"請輸入方格的數目 n (n<=30):";

?? cin>>n;????

?? cout<<n<<"個方格的正確涂色方案一共有"<<f[n]<<"種。"<<endl;

?? return 0;

}

轉載于:https://www.cnblogs.com/cs-whut/p/11022438.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248723.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248723.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在vue中methods互相調用的方法

在vue中methods互相調用的方法 轉載于:https://www.cnblogs.com/macT/p/10212878.html

MUI H5+ 開發app基礎

加載子頁面(防止手機性能差,出現上下滑動卡頓) 其中 url 就是子頁面的路徑 id 為自定義 通常和頁面名稱一致頁面的跳轉和傳值 切記 如果使用mui組件內的底部導航跳轉的方式只能使用document獲取元素的id 頁面跳轉傳值 新頁面接收參數 頁面初始化 H5加載完畢 判斷某個元素中是…

對象

一、對象 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript">/** JS中數據類型* String 字符串* Number 數值* Boolean 布爾值* Null 空值* Undefine…

uni-app 組件傳值

uni-app中的組件之間的傳值 我們將compontents中的test文件作為子組件 引入到index中使用 引入并使用 效果如下 父傳子 首先我們在父組件中使用子組件的標簽中去自定義title 在子組件中 通過props去接收并處理 效果如下&#xff1a; 子傳父 子組件中 設置一個按鈕…

JSP XML數據處理

JSP XML數據處理 當通過HTTP發送XML數據時&#xff0c;就有必要使用JSP來處理傳入和流出的XML文檔了&#xff0c;比如RSS文檔。作為一個XML文檔&#xff0c;它僅僅只是一堆文本而已&#xff0c;使用JSP創建XML文檔并不比創建一個HTML文檔難。 使用JSP發送XML 使用JSP發送XML內容…

Docker 圖形界面管理工具 -- Portainer

Portainer&#xff08;基于 Go&#xff09;是一個輕量級的管理界面&#xff0c;可讓您輕松管理Docker主機或Swarm集群。 Portainer的使用意圖是簡單部署。它包含可以在任何 Docker 引擎上運行的單個容器&#xff08;Docker for Linux 和 Docker for Windows&#xff09;。 Port…

vue cli3.0創項目報錯‘This may cause things to work incorrectly. Make sure to use the same version for b’

錯誤&#xff1a; throw new Error(^Error:Vue packages version mismatch:- vue2.6.12 (C:\Users\Administrator\AppData\Roaming\npm\node_modules\vue\dist\vue.runtime.common.js) - vue-template-compiler2.6.11 (C:\Users\Administrator\AppData\Roaming\npm\node_module…

Web程序中使用EasyUI時亂碼問題

今天偶然遇見使用easyUI時&#xff0c;彈窗和分頁都是亂碼的問題&#xff0c;耗費了很長的時間來解決&#xff0c;以此記住這個坑。 相信大家都會在使用easyUI時都會設置這樣一句&#xff1a; 那么就有可能出現設置中文后的亂碼問題&#xff0c;如下圖&#xff1a; 因為在使用e…

關于window對象

window對象 - navigator&#xff08;導航器對象&#xff09; appCodeName&#xff1a;返回瀏覽器的代碼名appName&#xff1a;返回瀏覽器的名稱appVersion&#xff1a;返回瀏覽器的平臺和版本信息cookieEnabled&#xff1a;返回指明瀏覽器中是否禁用cookie的布爾值platform&a…

160-PHP 文本替換函數str_replace(一)

<?php$strHello world!; //定義源字符串$searcho; //定義將被替換的字符$replaceO; //定義替換的字符串$resstr_replace($search,$replace,$str); //使用函數處理字符串echo "{$str}替換后的效果為&#xff1a;<br />{$res}";…

流的操作規律

IO流中對象很多&#xff0c;解決問題(處理設備上的數據時)到底該用哪個對象呢&#xff1f;   把IO流進行了規律的總結(四個明確)&#xff1a; 明確一&#xff1a;要操作的數據是數據源還是數據目的。 源&#xff1a;InputStream Reader 目的&#xff1a;OutputStream Writ…

看完就懂的編輯頁面如何巧妙處理時間

需求分析 分析&#xff1a; 我們通常會遇到這種情況&#xff0c;當我們制作一個表單頁面的時候&#xff0c;通常會有添加和編輯的情況&#xff0c;我們在提交的時候還需要將時間的格式轉換為字符串格式進行傳參。 在這里我們使用的是 iview 中的 DatePicker type格式為datetime…

[轉]Tomcat中8005/8009/8080/8443端口的作用

8005&#xff1a;關閉tomcat進程所用。當執行shutdown.sh關閉tomcat時就是連接8005端口執行“SHUTDOWN”命令--由此&#xff0c;我們直接telnet8005端口執行“SHUTDOWN”&#xff08;要大寫&#xff0c;小寫沒用&#xff1b;不運只能telnet 127.0.0.1 8005其他地址telnet都不能…

月入10萬和月入5千的人關鍵區別是什么???

月入10萬和月入5千的人關鍵區別是什么&#xff1f;&#xff1f;&#xff1f;知識體系、決策能力、魄力和格局&#xff01;&#xff01;&#xff01;人不學不知道&#xff0c;看過很多書&#xff0c;學過很多課&#xff0c;發現不久就忘了&#xff0c;很難真正被自己消化吸收&am…

關于“wap2app僅支持對已通過ICP備案的域名站點進行打包”問題解決

關于“wap2app僅支持對已通過ICP備案的域名站點進行打包”問題解決 如果我們是通過Vue技術寫的移動端&#xff0c;開發完成后我們的項目需要放到服務器上&#xff0c;然后我們在將服務器上面的項目打包apk格式 wap2app將網頁打包成apk步驟 使用HbuilderX創建一下wap2app項目 我…

第五周-第07章節-Python3.5-內置模塊詳解之OS模塊

os.sep:取代操作系統特定的路徑分隔符 os.name:指示你正在使用的工作平臺。比如對于Windows&#xff0c;它是nt&#xff0c;而對于Linux/Unix用戶&#xff0c;它是posix。os.getcwd:得到當前工作目錄&#xff0c;即當前python腳本工作的目錄路徑。os.getenv()和os.putenv:分別用…

2021前端面試題總結

HTML CSS 定位 flex布局 display css3新屬性 css3的邊框-border-radius–box-shadow–border-image 背景 background-size–background-origin &#xff1a;屬性規定背景圖片的定位區域。文字效果&#xff1a;text-shadow&#xff1a;在 CSS3 中&#xff0c;text-shadow …

mysql之庫操作_創建用戶_修改用戶權限_修改用戶密碼

用戶操作&#xff1a; 1、create user Faye127.0.0.1IDENTIFIED BY 123 #添加一個用戶名字為Faye的用戶,127.0.0.1為本機的ip,123為密碼 補&#xff1a;create user Faye% IDENTIFIED BY 123 #添加一個用戶名字為Faye的用戶,‘%’的意思為所有人都可以連接Faye這個用戶,123為…

前端導出文件,后端返回文件流過大直接干崩潰

前端導出文件 前端很常見的導出需求 導出world xlsx 甚至是zip 在我這個項目中是導出圖片&#xff0c;圖片量還是蠻大的&#xff0c;直接干崩潰了 我們這里是后端同學直接返回的是文件流 通過調用接口拿到文件流后直接調用下面的方法 export function exportZip(res, name)…

在eclipse中創建第一個java應用程序,并在控制臺輸出“hello world”。

package com.fs.test;public class HelloWorld {public void aMethod() {}public static void main(String[] args) {System.out.print("Hello world");}}轉載于:https://www.cnblogs.com/ooo888ooo/p/11042700.html