前言
注意: 本文不是新系列,只是学习算法时偶尔用到的笔记(刷题用的),不定期更新
这是一篇关于算法基础的文章,不涉及任何数学分析,只有最最基础的逻辑思维过程。大部分内容是个人理解,每个人想法自然迥异,欢迎讨论。
Q: Javascript里面有算法吗?
A: 有。
Q: 在哪?
A: 任何框架的源码里。
好了,言归正传吧。
开始:理解递归
关于递归,每本书的概念可能各不相同,有的细致、有的粗略,但表示的含义都是一致的,详细概念这里就略过,我在这里只做总结:
- 递归的关键点在于简化、归纳问题,而不是分解问题。
- 递归的本质是自己依赖自己,换言之,要能够分析自身过程的依赖规律。
下面给定两个例子,方便理解递归过程是怎样工作的。
注意:
下面的示例为实验参考,请不要在生产代码使用。
求和
给定一个数列:
1 2 3 4 5 6 7 … N
求 N
项的和Sn
。
假设n
项的数列和为S(n)
, 那么:
n=1 S(1) = 1 // 极限情形
n=2 S(2) = 2 + S(1) // S(2) 依赖于S(1)。
n=3 S(3) = 3 + S(2)
....
所以N
项时,其规律为:
S(n) = n + S(n-1)
写成Javascript
为:
// show 是一个工具函数
function show(...args){
let str = args.join(' ');
document.write("<p>"+str+"</p>")
}
// 正文
function sum(n){
if(n==1) return 1
return n + sum(n-1)
}
show(sum( 3 )) // 6
show(sum( 4 )) // 10
show(sum( 100 )) // 5050
求第N项的值
给定一个数列:
1 2 3 6 12 24 48 96 192 384 …
求第N项的值。
假设第N项的值为F(n)
;那么:
n=1 F(1)=1 // 极限情形1
n=2 F(2)=2 // 极限情形2
n=3 F(3)= F(1)+F(2) = 3 // 多次依赖
n=4 F(4)= F(1)+F(2)+F(3) = 6
n=5 F(5)= F(1)+F(2)+F(3)+F(4)=12
... ...
伪代码:
f(n){
if n=1; return 1;
if n=2; return 2;
n2= n, sum=0
while(n2) sum+=f(--n2) // 多次依赖的时候,可以用循环
return sum
}
写成Javascript
代码为:
function f(n){
if(n==1) return 1
if(n==2) return 2
let n2 = n, s =0
while(n2)
s+=f(--n2)
return s;
}
show(f( 3 )) // 3
show(f( 4 )) // 6
show(f( 10 )) // 384
okay, 基本上用数列入门递归是最简单的。记住这种感觉即可。
树
为简单起见,这里使用最简单的一种树——二叉树。
描述:
在二叉树中&#x