1. 程式人生 > >【淺談遞迴(一)】遞迴的基本思想

【淺談遞迴(一)】遞迴的基本思想

1、遞迴簡述

遞迴作為程式設計裡最為重要的程式設計方法之一,其對於解決某些複雜的問題十分有效,並且相對於迭代,其過程在直觀上更容易理解。而且不像迭代自己需要維護許多變數,遞迴也更容易實現。

2、遞迴的基本思想

遞歸併不是簡單的自己呼叫自己,也不是簡單的互動呼叫。遞迴在於把問題分解成規模更小、具有與原來問題相同解法的問題,如二分查詢以及求集合的子集問題。這些都是不斷的把問題規模變小,新問題與原問題有著相同的解法。但是並不是所有所有可以分解的子問題都能使用遞迴來求解。一般來說使用遞迴求解問題需要滿足以下的條件:

  • 可以把要解決的問題轉化為一個子問題,而這個子問題的解決方法仍與原來的解決方法相同,只是問題的規模變小了。
  • 原問題可以通過子問題解決而組合解決。
  • 存在一種簡單的情境,是問題在簡單情境下退出。

例如斐波拉契數列問題,一個數列滿足 1,1,2,3,5….. 的形式,即當前項為前兩項之和的形式,那麼則稱這個數列為斐波拉契數列。假設現在要求第 n 項數列的值。
則 f(n) 我們可以通過求的 f(n-1),f(n-2) 所得,原問題可以轉化為兩個子問題,滿足條件一。
假設我們現在得到 f(n-1)、f(n-2)。f(n)=f(n-1)+f(n-2), 滿足條件二。
原問題可以通過子問題的解決而解決。而 f(1)=1,f(2)=1, 已知,即存在簡單情境使得遞迴退出,滿足條件三。所以此問題解法如下

int fib(n){ 
if(n==1)        
    return 1;   
if(n==2)        
    return 1;   
return fib(n-1)+fib(n-2);}

呼叫過程
1
通過上面的例子可以總結出遞迴問題的分析思路

  • 分析問題看是否可以分解成子問題
  • 子問題和原問題之間有何關係
  • 是否有退出的簡單條件

在分析問題時我們可以採用自下而上,先分析簡單情況,然後看複雜情況是否可以由簡單情況組合形成,也可以自上而下,把複雜問題分解成子問題,在此過程中需要注意子問題是否有重疊。

3、經典的遞迴問題:

  1. 階乘問題
  2. 漢諾塔問題
  3. 斐波那契數列問題

相關推薦

基本思想

1、遞迴簡述 遞迴作為程式設計裡最為重要的程式設計方法之一,其對於解決某些複雜的問題十分有效,並且相對於迭代,其過程在直觀上更容易理解。而且不像迭代自己需要維護許多變數,遞迴也更容易實現。 2、遞迴的基本思想 遞歸併不是簡單的自己呼叫自己,也不是簡單的互動

WebService開發

man att set style 訪問 row nag 序列 ros 一、什麽是WebService: 簡單通俗來說,就是企業之間、網站之間通過Internet來訪問並使用在線服務,一些數據,由於安全性問題,不能提供數據庫給其他單位使用,這時候可以使

Java數組

spa bound pan .... exceptio 運行 輸出 結構 語法 數組: 編程語言中最常見的一種數據結構,數組就是內存中一段連續的存儲空間。可以用於存儲多個數據,每個數組元素存放一個數據,通常可通過數組元素的索引來訪問數組元素。 1.java數組:   具有相

密碼學基礎知識

說到密碼想必大家都不陌生,其實世界上有兩種密碼,通俗的說:一種是防止小孩偷看你的檔案;另一種是防止當局閱讀你的檔案。 那麼現在我們來說說專業術語 - 傳送者和接收者 傳送者和接收者就不必多說了,一方傳送訊息,另一方接收訊息,以至於第三方(竊聽者)

spring框架

spring是一個非常活躍的開源框架,他是一個基於core來架構的多層JavaEE的框架,他的主要目的是簡化企業級開發。 使用spring框架,需要用到spring框架的核心jar包,需要的話,這是連結http://pan.baidu.com/s/1cd9DHs spri

計算機網路初識計算機網路

  大學期間,上過不少理論專業課,也讀過一些該專業領域的“名著”。但是最讓我驚歎的書,莫過於計算機網路(自頂向下的方法)。計算機網路,是最貼近我們生活的一門技術,同時它的體系也是極其龐大的,好比我們要了解一個國家從古至今的歷史,或是一個從基層到上層的管理制度。強烈推薦初學自

堆-Heap

應用場景和前置知識複習 堆排序 排序我們都很熟悉,如氣泡排序、選擇排序、希爾排序、歸併排序、快速排序等,其實堆也可以用來排序,嚴格來說這裡所說的堆是一種資料結構,排序知識它的應用場景之一 Top N的求解 優先佇列 堆得另一個重要的應用場景就是優先佇列 我們

Fiddler的常用功能

fiddler 更改host一、Host配置可以使用fiddler配置host將一些文件的服務ip進行更改。操作步驟:1、點擊tools->HOSTS->勾選彈窗,啟動enable->配置ip地址和域名->保存後,重新請求一次,查看服務器ip地址。2、如果不想使用host時直接取消勾

web框架 Cloud-Admin學習筆記環境搭建

Cloud-Admin是目前比較流行的基於Spring Cloud的web框架. 碼雲下載地址: https://gitee.com/minull/ace-security 1、用git也可直接下載,(也可直接下載解壓安裝)   2、用idea開啟專案 file-

數字影象處理之數字影象處理與相關領域概述

機器視覺就是用機器代替人眼來做測量和判斷。機器視覺系統是指通過機器視覺產品(即影象攝取裝置,分 CMOS 和CCD 兩種)將被攝取目標轉換成影象訊號,傳送給專用的影象處理系統,根據畫素分佈和亮度、顏色等資訊,轉變成數字化訊號;影象系統對這些訊號進行各種運算來抽取目標的特徵,進而根據判別的結果來實現高效的機器控

mybatis學習之入門

前言:       從開始的JDBC經歷dbuttls,mybatis,Hebernate,JDBC是最熟悉不過的了,JDBC提供了一種基準,據此可以構建更高階的工具和介面,使資料庫開發人員能夠編寫

演算法之動態規劃動態規劃DP詳解

一、基本概念 動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程(multistep d

SDKD 14級組隊練習賽 J 列印圖案

Description A fractal is an object or quantity that displays self-similarity, in a somewhat technical sense, on all scales. The object need not ex

斐波那契數列--對比與動態規劃JAVA

兔子繁殖問題: 這是一個有趣的古典數學問題,著名義大利數學家Fibonacci曾提出一個問題:有一對小兔子,從出生後第3個月起每個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子。按此規律,假設沒有兔子死亡,第一個月有一對剛出生的小兔子,問第n個月有多少

ABAP自學系列

發的 img api .cn ima code pat 查看 屏幕 一、查看補丁包級別 然後看Patch Level即可。 常用T-code: SE38(寫程序) SE80(屏幕開發) Smartform(開發smartform打印) SE37(可以查看function

養成良好的學習習慣-學習方法2

成功最有效的方法是想有經驗的人學習成功最有效的方法是想有經驗的人學習!借鑒成功的人的態度和習慣。你可以讓你在任何想達到的目標表提高成功率!1、學習不專心。上課期間少幹別的。上課保持最大化的輸入,討論自己把知識最大化的輸出。課下把知識最大化會化的輸出。2、分組學習,找1-2個同伴,共同學習。今天上午學一個點,共

養成良好的學習習慣-學習方法1

養成 學習習慣 良好的 淺談學習方法(1) 1.老男孩教育要培訓什麽? 思想技術 知識 2.養成良好的學習習慣和聽課習慣 1)帶一支筆和本,記錄老師講解的內容 2 總結時 ,記錄關鍵的信息,抓重點 3) 聽課習慣:調動所有感官學習 眼睛看、勤動手(

沃特森萬融VAC鏈積分增值體系的顛覆性應用

分享 tle gin 不同 value ces 0ms 移動通信 conf 從區塊鏈歷史上來說,先誕生了比特幣,當時並沒有區塊鏈這個技術和名詞,然後業界從比特幣中提取了技術架構和體系,稱之為區塊鏈技術。從比特幣提取的區塊鏈技術稱之為區塊鏈1.0時代,那個時候的應用主要以電子

JavaScript基礎知識從入深理解

isn argument javascrip turn console bom || 將不 函數聲明 JavaScript的簡介   javascript是一門動態弱類型的解釋型編程語言,增強頁面動態效果,實現頁面與用戶之間的實時動態的交互。   javascript是

漫畫-微積分學習

ID 開始 .cn src chang white solid 一段 round 背景     大家有沒有考慮過,工作(編程)一段時間之後,我們都會出現技術上的瓶頸,怎麽去突破?   我自身領悟到的是,除了抽象問題能力的提升外,如