标签:
几天没有更新,这两天是周末,给大家整理了一几篇东西,有关于作用域的,闭包的,还有递归的,闭包和递归,对于大部分初次接触编程的人来说还是有些难度的,昨天,花了一点时间给大家整理了一下,今天,给大家上传上来,让大家看看,部分属于个人观点,如有错误,欢迎指出
这一篇,给大家讲讲递归,昨天整理着三篇文章花了点时间,查了点资料,把自己的理解和大家说说,但是很多我也讲的不是很清楚,所以这一篇当中会用很多的小例子,小练习,给大家说说,希望可以给大家讲讲清楚。
在程序中,所谓的递归,就是函数自己直接或者间接的调用自己
就递归而言最重要的就是跳出结构,因为跳出了才可以有结果
递归的调用,写递归函数,最终还是要转换为自己这个函数
假如有一个函数f,如果它是递归函数,那么也就是说函数体内的问题还是转换为f的形式
递归思想就是将一个问题转换为一个已解决的问题来实现
function f(){
...f(...)...
}
例子: 1, 2, 3, 4, 5, ..., 100
var res = foo( 100 );
var res = foo( 99 ) + 100;
function foo( n ) {
return n + foo( n - 1 );
}
function foo( n ) {
if ( n == 1 ) return 1;
return n + foo( n - 1 );
}
练习: 求 1, 3, 5, 7, 9, ... 第 n 项的结果与前 n 项和. 序号从 0 开始
求第 n 项的
function fn( n ) {
return fn( n-1 ) + 2;
}
function fn( n ) {
if ( n == 0 ) return 1;
return fn( n-1 ) + 2;
}
前n项和
function sum( n ) {
return fn( n ) + sum( n - 1 );
}
function sum( n ) {
if ( n == 0 ) return 1;
return fn( n ) + sum( n - 1 );
}
练习: 2, 4, 6, 8, 10 第 n 项与 前 n 项和
第n项
function fn( n ) {
if ( n == 0 ) return 2;
return fn( n-1 ) + 2;
}
前n项和
function sum( n ) {
if ( n == 0 ) return 2;
return sum( n - 1 ) + fn( n );
}
练习: 数列: 1, 1, 2, 4, 7, 11, 16, … 求 第 n 项, 求前 n 项和.
求第 n 项
function fn( n ) {
if ( n == 0 ) return 1;
return fn( n-1 ) + n - 1;
}
如果从 1 开始表示, 那么第 n 项为
前n项和
function sum( n ) {
if ( n == 0 ) return 1;
return sum( n - 1 ) + fn( 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 ) {
if ( n == 0 || n == 1 ) return 1;
return fib( n - 1 ) + fib( n - 2 );
}
阶乘是一个运算, 一个数字的阶乘表示的是从 1 开始 累乘到这个数字. 例如 3! 表示 1 * 2 * 3
. 5! 就是 1 * 2 * 3 * 4 * 5
. 规定 0 没有阶乘, 阶乘 从 1 开始.
求 n 的阶乘
function foo ( n ) {
if ( n == 1 ) return 1;
return foo( n - 1 ) * n;
}
求幂就是求 某一个数 几次方
2*2 2 的 平方, 2 的 2 次方
求 n 的 m 次方
最终要得到一个函数 power( n, m )
n 的 m 次方就是 m 个 n 相乘 即 n 乘以 (m-1) 个 n 相乘
function power ( n, m ) {
if ( m == 1 ) return n;
return power( n, m - 1 ) * n;
}
可能还有些人不知道什么是深拷贝,深拷贝对应的是浅拷贝
如果要实现深拷贝那么就需要考虑将对象的属性, 与属性的属性, ... 都拷贝过来
如果要实现:
function clone( o1, o2 ) {
for ( var k in o2 ) {
o1[ k ] = o2[ k ];
}
}
找递推关系,或叫化归为已经解决的问题
function clone( o1, o2 ) {
for ( var k in o2 ) {
if ( typeof o2[ k ] == ‘object‘ ) {
o1[ k ] = {};
clone( o1[ k ] , o2[ k ] );
} else {
o1[ k ] = o2[ k ];
}
}
}
复杂实现:clone(o) -> newObj
function clone( o ) {
var temp = {};
for ( var k in o ) {
if ( typeof o[ k ] == ‘object‘ ) {
temp[ k ] = clone( o[ k ] );
} else {
temp[ k ] = o[ k ];
}
}
return temp;
}
请用 递归实现 getElementsByClassName
<div>
<div>1
<div class="c">2</div>
<div>3</div>
</div>
<div class="c">4</div>
<div>5
<div>6</div>
<div class="c">7</div>
</div>
<div>8</div>
</div>
function byClass( node, className, list ) {
var arr = node.childNodes;
for ( var i = 0; i < arr.length; i++ ) {
if ( arr[ i ].className == className ) {
list.push( arr[ i ] );
}
if ( arr[ i ].childNodes.length > 0 ) {
byClass( arr[ i ], className, list );
}
}
}
标签:
原文地址:http://www.cnblogs.com/brightking/p/5745742.html