幾天沒有更新,這兩天是週末,給大家整理了一幾篇東西,有關於作用域的,閉包的,還有遞迴的,閉包和遞迴,對於大部分初次接觸程式設計的人來說還是有些難度的,昨天,花了一點時間給大家整理了一下,今天,給大家上傳上來,讓大家看看,部分屬於個人觀點,如有錯誤,歡迎指出
這一篇,給大家講講遞迴,昨天整理著三篇文章花了點時間,查了點資料,把自己的理解和大家說說,但是很多我也講的不是很清楚,所以這一篇當中會用很多的小例子,小練習,給大家說說,希望可以給大家講講清楚。
在程式中,所謂的遞迴,就是函式自己直接或者間接的呼叫自己
直接呼叫自己
間接呼叫自己
就遞迴而言最重要的就是跳出結構,因為跳出了才可以有結果
遞迴的呼叫,寫遞迴函式,最終還是要轉換為自己這個函式
假如有乙個函式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...