遞迴的相關概念

2022-08-27 13:18:12 字數 3496 閱讀 1788

幾天沒有更新,這兩天是週末,給大家整理了一幾篇東西,有關於作用域的,閉包的,還有遞迴的,閉包和遞迴,對於大部分初次接觸程式設計的人來說還是有些難度的,昨天,花了一點時間給大家整理了一下,今天,給大家上傳上來,讓大家看看,部分屬於個人觀點,如有錯誤,歡迎指出

這一篇,給大家講講遞迴,昨天整理著三篇文章花了點時間,查了點資料,把自己的理解和大家說說,但是很多我也講的不是很清楚,所以這一篇當中會用很多的小例子,小練習,給大家說說,希望可以給大家講講清楚。

在程式中,所謂的遞迴,就是函式自己直接或者間接的呼叫自己

直接呼叫自己

間接呼叫自己

就遞迴而言最重要的就是跳出結構,因為跳出了才可以有結果

遞迴的呼叫,寫遞迴函式,最終還是要轉換為自己這個函式

假如有乙個函式f,如果它是遞迴函式,那麼也就是說函式體內的問題還是轉換為f的形式

遞迴思想就是將乙個問題轉換為乙個已解決的問題來實現

function f()
例子: 1, 2, 3, 4, 5, ..., 100

首先假定遞迴函式已經寫好, 假設是 foo. 即 foo( 100 ) 就是求 1 到 100 的和

尋找遞推關係. 就是 n 與 n-1, 或 n-2 之間的關係: foo( n ) == n + foo( n - 1 )

var res = foo( 100 );

var res = foo( 99 ) + 100;

將遞推結構轉換為 遞迴體

function foo( n )

將臨界條件加到遞迴體中

function foo( n )

練習: 求 1, 3, 5, 7, 9, ... 第 n 項的結果與前 n 項和. 序號從 0 開始

求第 n 項的

首先假定遞迴函式已經寫好, 假設是 fn. 那麼 第 n 項就是 fn( n )

找遞推關係: fn( n ) == f( n - 1 ) + 2

遞迴體

function fn( n )

找臨界條件

加入臨界條件

function fn( n )

前n項和

假設已完成, sum( n ) 就是前 n 項和

找遞推關係: 前 n 項和 等於 第 n 項 + 前 n-1 項的和

得到遞迴體

function sum( n )

找臨界條件

得到遞迴函式

function sum( n )

練習: 2, 4, 6, 8, 10 第 n 項與 前 n 項和

第n項

function fn( n )
前n項和

function sum( n )
練習: 數列: 1, 1, 2, 4, 7, 11, 16, … 求 第 n 項, 求前 n 項和.

求第 n 項

假設已經得到結果 fn, fn( 10 ) 就是第 10 項

找遞推關係

遞迴體也就清楚了, 臨界條件是 n == 0 => 1

function fn( n )

如果從 1 開始表示, 那麼第 n 項為

假設已經得到結果 fn, fn( 10 ) 就是第 10 項

找遞推關係

臨界條件 n == 1 => 1

前n項和

function sum( n )
如果從 0 開始

0  1  2  3  4  5   6

1, 1, 2, 4, 7, 11, 16,

如果從 1 開始

1  2  3  4  5  6   7

1, 1, 2, 4, 7, 11, 16,

練習: fibonacci 數列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, … 求其第 n 項.

遞推關係 fn(n) == fn( n- 1) + fn( n - 2)

function fib( n )
階乘是乙個運算, 乙個數字的階乘表示的是從 1 開始 累乘到這個數字. 例如 3! 表示1 * 2 * 3. 5! 就是1 * 2 * 3 * 4 * 5. 規定 0 沒有階乘, 階乘 從 1 開始.

求 n 的階乘

function foo ( n )
求冪就是求 某乙個數 幾次方

2*2 2 的 平方, 2 的 2 次方

求 n 的 m 次方

最終要得到乙個函式 power( n, m )

n 的 m 次方就是 m 個 n 相乘 即 n 乘以 (m-1) 個 n 相乘

function power ( n, m )
可能還有些人不知道什麼是深拷貝,深拷貝對應的是淺拷貝

什麼是深拷貝, 什麼是淺拷貝

**的封裝

如果要實現深拷貝那麼就需要考慮將物件的屬性, 與屬性的屬性, ... 都拷貝過來

如果要實現:

假設已經實現clone(o1,o2),將物件o2的成員拷貝乙份交給o1

簡單的演算法,將o2的屬相拷貝到o1中去

function clone( o1, o2 ) 

}

找遞推關係,或叫化歸為已經解決的問題

複雜實現:clone(o) -> newobj

function clone( o ) ;

for ( var k in o ) else

}return temp;

}

請用 遞迴實現 getelementsbyclassname

1

23 4

5 6

7 8

如果實現乙個方法byclass(node,"c",list),表示在某乙個節點上查詢符合class屬性為c的元素

在當前元素的子元素中查詢,如果有符合要求的,儲存到乙個陣列中

首先遍歷子節點,然後看子節點是否還有子節點,如果沒有直接判斷,如果有再遞迴

function byclass( node, classname, list ) 

if ( arr[ i ].childnodes.length > 0 )

}}

遞迴的概念 函式遞迴過程

直接或間接地呼叫自身的演算法稱為遞迴演算法。用函式自身給出定義的函式稱為遞迴函式。使用遞迴技術往往會使 更簡潔,使演算法的描述更清晰且容易理解。例 1 階乘函式 階乘函式遞迴的定義為 當n 0時,n 1,這是這個函式的初始條件,是非遞迴定義的,是此遞迴函式的退出條件。這個遞迴函式在執行時,會不斷的呼...

1 3對數器與遞迴相關概念

對數器的概念和使用 理解 0,有乙個你想要測的方法a,1,實現乙個絕對正確但是複雜度不好的方法b,2,實現乙個隨機樣本產生器 3,實現比對的方法 4,把方法a和方法b比對很多次來驗證方法a是否正確。5,如果有乙個樣本使得比對出錯,列印樣本分析是哪個方法出錯 6,當樣本數量很多時比對測試依然正確,可以...

CVS的相關概念

在我們使用cvs進行軟體開發過程中的版本控制的時候,經常遇到一些概念,弄清楚這些概念的含義有利於我們更好的服務於專案管理與開發 1.repository 倉庫 它是 cvs伺服器 可能在遠端,也可能在本地 的根目錄,我們所有的工作都儲存在這個倉庫中,包括源 和這些 的全部歷史。你可以把reposit...