1. 程式人生 > >程式設計競賽2.1.1 遞迴

程式設計競賽2.1.1 遞迴

遞迴的定義:在一個函式中再次呼叫該函式的行為叫做遞迴。


我們可以編寫一個求階乘的程式碼如下:

int fact(int n)
{
    if(n == 0) return 1;
    return n * fact(n-1);
}

遞迴必須要有一個終止條件,不然遞迴會一直進行下去。同理可得,斐波那契數列的定義為a0=0,a1=1,an = an-1 + an-2(n>1),我們可以的到他的程式碼,這裡就不給出了。

然而,遞迴有一個經典的問題,即使在求解一個問題的時候,時間複雜度的規模會以指數規模來成長,針對斐波那契數列,我們求解n=40的時候,都會花費較大的時間,針對這種問題,我們可以採用將結果預先儲存的方法,在求解到具體的某一步時,我們首先檢視這個結果是否在之前是否計算過,然後決定是否求解,這種方法,大大降低了運算時間,優化了空間。我們的程式碼如下:

int memo[MAX_N+1];

int fib(int n)
{
	if(n < 1) return n;		//兩個初識情況
	if(memo[n] != 0) return memo[n];
	return memo[n] = fib(n - 1) + fib(n -2); 
}

相關推薦

程式設計競賽2.1.1

遞迴的定義:在一個函式中再次呼叫該函式的行為叫做遞迴。我們可以編寫一個求階乘的程式碼如下:int fact(int n) { if(n == 0) return 1; return n * fact(n-1); }遞迴必須要有一個終止條件,不然遞迴會一直進行下

一箇中興的面試題,輸入兩個數n和m,從數列1,2,3……n中隨意取幾個數,使其和等於m,要求將其中所有組合列出來程式設計求解(c語言函式分解法)

原題目:輸入兩個數n和m,從數列1,2,3……n中隨意取幾個數,使其和等於m,要求將其中所有組合列出來程式設計求解 c語言解法分析:            先判定n和m的大小,如果m小於n,則只需從1,2……m之間找出和為m的組合即可,如果m大於n,則需要判斷1~n的和是否

1.8 列出目錄裡的檔案 1.9 匿名函式

1.8 遞迴列出目錄裡的檔案 這個需求類似於find,把目錄以及其子目錄的檔案和目錄列出來 os模組的幾個方法 os.listdir('dir') \\列出路徑下的所有檔案及目錄 os.path.isdir(‘dir’) \\判斷是否是目錄 os.path.isfile(‘file’)

1.8 列出目錄裡的檔案 1.9 匿名函式

1.8 遞迴列出目錄裡的檔案 這個需求類似於find,把目錄以及其子目錄的檔案和目錄列出來 os模組的幾個方法 os.listdir('dir') \\列出路徑下的所有檔案及目錄 os.path.isdir(‘dir’) \\判斷是否是目錄 os.path.isfile(‘file’) \\判斷時候是檔案

19.1.5

1、遞迴演算法解決問題的特點: (1)遞迴就是在過程或函式裡呼叫自身 (2)在使用遞迴策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口。 (3)遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低,所以一般不提倡用遞迴演算法設計程式。 (4)在遞迴呼叫的過程中系統為每一層的

Python練習(1):和動態規劃的簡單應用

首先考慮一個問題,假如我們在某個編譯器上寫出了這樣的式子:(i++)(i++)(i++),假設i = 5,那麼會有多少可能的結果? 顯然,編譯器對這種行為是未定義的,我們不知道i自增和乘法指令的執行順序,可能的結果有5*5*5, 5*5*6, 5*5*7, 5

吳恩達Coursera深度學習(5-1神經網路 RNN

Class 5:序列模型 Sequence Models Week 1:迴圈神經網路 RNN(Recurrent) 目錄 本課程將教你如何建立自然語言,音訊和其他序列資料的模型。 由於深入的學習,序列演算法的執行速度遠遠超過兩年前,這

C語言學習總結(1)-函式的理解

啥是遞迴? 即是該函式呼叫它本身自己,這種呼叫過程稱為遞迴。 遞迴可以相當於迴圈,所以想結束遞迴,就必須有終止遞迴的條件測試部分,否則就會出現無限遞迴(即無限迴圈)。同時,這也是使用遞迴的難點

leetcode+最少步數到達1

點選開啟連結//分奇偶函式遞迴 class Solution { public: int integerReplacement(int n) { if(n==1) return

與試探回溯(1) 簡單分析

遞迴分析往往是新手在學習資料結構是難點,見到遞迴就頭大。網上看了諸多總結,千變萬化,其實都不如自己從頭到尾分析一下。在這一個章節,我就先不對遞迴的漸進複雜度和空間複雜度做分析,因為我實在沒有完全搞懂。 其實遞迴呼叫(recursive call) 就是某一方法

2018年上海金馬五校程式設計競賽 Problem O : ±1 Matrix

Time Limit: 5 sDescriptionA matrix in mathematics is a rectangular array of numbers arranged in rows and columns. Given an n×m matrix A and an m×k matrix B

[計算機程式設計C++] Fibonaci數列的與非演算法實現

本文是對西安交通大學C++慕課第三章程式設計練習的16題的講解。 參考部落格:https://blog.csdn.net/zombie_slicer/article/details/38871799 題目內容: 編寫程式,顯示Fibonaci序列的前n項(從

程式設計3:僅用函式和棧操作逆序一個棧

<?php header("content-type:text/html;charset=utf-8"); /* * 僅用遞迴函式和棧操作逆序一個棧 P8 */ function getAndRemoveLastElement(SplStack $stack){ if($stack-

Codeforces Round #383 (Div. 2) C(找環求最小公倍數)

題目連結 題目大意:表示意思有點繞,什麼owww的,通俗的來講就是找環,問的是滿足x走到y的步數可以讓y走到x。 分析 那麼如果x走到x是一個偶數n,說明可以用n/2走到y且y不等於x 然後再用n/2步數走到x。這個環的權值就是n/2; 如果n是一個奇

挑戰程式設計競賽2 演算法和資料結構 讀後感

介紹 本篇主要是講《挑戰程式設計競賽2 演算法和資料結構》書的讀後感和部分題目的再次解讀、程式設計。包括書中的部分程式碼和一些個人的見解。如果想深入瞭解,建議去網上買一本回來看,比較適合學習演算法的初學者。 章節 第一章 第一章主要

挑戰程式設計競賽2 資料結構與演算法學習筆記

例題 有一組n個數,求在這組數中 str[j]-str[i] 的最大值,且j>i., 2<n<20000。 我最初的思路是, max=0;  for(i=0;i<n;i++) {   for(j=0;j<i;j++)    {       i

Linux下的c基礎程式設計——十進位制轉二進位制(法)

今天我們來用遞迴法寫一個十進位制轉二進位制的小程式。 首先大家要明白十進位制轉二進位制的演算法。 第一步先對2進行取餘。餘數就是二進位制的最後一位。 第二步對2進行整除所得的數再進行對2取餘 第三步用遞迴迴圈往復以上過程。 例如求5的二進位制。 5先對2取餘,餘1,最後一位

演算法設計與分析:第二章 2.6基於的插入排序

/* 基於遞迴的插入排序: 將待插入的關鍵字插入到已經排好序的序列中 遞迴基:當陣列元素個數n=1時,只有一個元素,已經是排序的 遞迴步:如果前面k-1個元素已經排序,只要將第k個元素逐漸與 前面k-1個元素比較,把他插入到適當位置,即可完成k個元素的排序 遞迴的規律總

併發程式設計中死鎖、鎖、程序/執行緒池、協程TCP伺服器併發等知識點

1、死鎖 定義; 類似兩個人分別被囚禁在兩間房子裡,A手上拿著的是B囚禁房間的鑰匙,而B拿著A的鑰匙,兩個人都沒法出去,沒法給對方開鎖,進而造成死鎖現象。具體例子程式碼如下: # -*-coding:utf-8 -*- from threading import Thread,Lock,RLoc

一列數字的規則如下;112,3,5,8,13,21,34........ 求第30位數字是多少,用規和非兩種方法演算法實現

斐波納契數列(Fibonacci Sequence),又稱黃金分割數列。在數學上,斐波納契數列以如下被以遞迴的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,現在我從演算法的角度,利用遞迴和非