发表于: 2019-10-29 20:46:57
1 1077
今天完成的事情:设计前台方案
昨天设计好了数据库的层级结构,总共有三层,现在有一个问题,是将这3层全放在一张表中,还是一层一个表。
最后还是决定一层一个表,虽然表数量的增加会影响数据库的性能以及运行的速度,但是实际情况实际考虑,鉴于数据量不是很大,也没有多少操作经验,多表方便修改。
树形结构的遍历用递归能极大减少代码量,去了解了一下什么是递归
所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
我们可以把递归 比喻成 查字典 ,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。
可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。
递归的概念感觉挺好理解的,结合一个简单的例子 阶乘
int Factorial(int n){
if (n == 0) return 1;
return
n * Factorial(n - 1);
}
取 n=3,则过程如下:
第 1~4 步,都是入栈过程,Factorial(3)调用了Factorial(2),Factorial(2)又接着调用Factorial(1),直到Factorial(0);
第 5 步,因 0 是递归结束条件,故不再入栈,此时栈高度为 4,即为我们平时所说的递归深度;
第 6~9 步,Factorial(0)做完,出栈,而Factorial(0)做完意味着Factorial(1)也做完,同样进行出栈,重复下去,直到所有的都出栈完毕,递归结束。
每一个递归程序都可以把它改写为非递归版本。我们只需利用栈,通过入栈和出栈两个操作就可以模拟递归的过程,二叉树的遍历无疑是这方面的代表。
但是并不是每个递归程序都是那么容易被改写为非递归的。某些递归程序比较复杂,其入栈和出栈非常繁琐,给编码带来了很大难度,而且易读性极差,所以条件允许的情况下,推荐使用递归。
如果下面这两点是成立的,我们就知道这个递归对于所有的 n 都是正确的。
当 n=0,1 时,结果正确;
假设递归对于 n 是正确的,同时对于 n+1 也正确。
这种方法很像数学归纳法,也是递归正确的思考方式,上述的第 1 点称为基本情况,第 2 点称为通用情况。
在递归中,我们通常把第 1 点称为终止条件,因为这样更容易理解,其作用就是终止递归,防止递归无限地运行下去。
对递归有了一个基本的概念,但是要运用到实际中,感觉还是要有一个例子参考,再结合实际情况作出修改,否则感觉第一次独立写出一个递归的逻辑还是有些困难,再多看几个例子吧,毕竟实际项目的逻辑也不是很复杂,自己多试试,多改改吧。
明天计划的事情:开始写接口了
遇到的问题:理论不知道能不能运用到实践中,还需要实战演练
收获:了解了递归
评论