算法书学习笔记2

14天阅读挑战赛

关于算法,其实也有系统性的去看过一些视频和书籍,但是每次看完都存在一个问题,就是还是不会写或者直接暴力法搞出来,这简直不够优雅!然而我恰好遇到了CSDN的这个算法学习活动,因此想借这个机会,再续前缘!

本次的博客参考的书籍为:异步社区-致力于优质IT知识的出版和分享 (epubit.com)

 本文将从书籍的1.4-1.6进行文章的学习。废话不多说,直接开干!

1.4学习笔记

在看到这个兔子生兔子的问题时,我就想起来我之前看到的一些课程中,也有对这个问题的描述,这是一个典型的递归问题。

在这里我先说一下我个人对递归的理解,然后再结合文章说一下自己的感受,以及百度官方的解释。

个人:递归就是说一个函数不断的调用自己,直到不满足判断条件,然后从最后一个再回到最开始,从而执行完一个过程。在这之中,最重要的是如何进行递归以及如何把判断条件写好,否则就会执行死循环而不会结束整个过程。

百度:递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

感受:

 我们结合题目来看。首先满足条件为:

算法书学习笔记2_第1张图片

 对于第一个月和第二个月都是1,那么我们直接写出来就行。

对于后面的月份,我们满足当月兔子=上月兔子+上上月兔子

这就是上面公式的由来,在满足这个表达式之后,我们的代码就写好了。

int ans(int n){
    if(n == 1 || n == 2){
        return 1;
    }
    else{
        return ans(n - 1) + ans(n - 2);
    }
}

在文章中,还考虑了对于递归的复杂度问题进行了考虑,在这里我们简单提一下,这里是利用了数组来简化运算,从而提高了效率,但对于新手来说,我们首先要考虑的是从0到1的问题,至于创新环节,我个人认为还是要尽力而为!

1.5学习笔记:

在这里作者主要针对算法难学进行了一些解释。我们还是老规矩,我先说说我的理解。

1.在于不会写,很多问题拿到题目,完全就是没有思路,对于一些有思路题目,我们以交换字符串举例。好,我们要交换整个字符串顺序,那么我们就会想,把第一个和最后一个互换,第二个和倒数第二个呼唤。直到所有,但这里其实还有一些小细节,例如字符串长度为奇数偶数时,遍历的时候用for还是while。

void swap(int str){
    char tmp;
    for(int n = 0, m = str.size()-1; n < m ; n++, m--){
        tmp = str[n];
        str[n] = str[m];
        str[m] = str[n];
    }
}

这是一个写法,但其实我们还可以牺牲空间复杂度,创建一个新数组,直接倒着插入即可。

所以,一个算法,不仅要考虑数据的结也要考虑算法的私信。

1.6学习笔记:

这里是文章的第一部分的总结,主要针对两篇文章的重要问题进行了总结,具体如下:

算法书学习笔记2_第2张图片

 

你可能感兴趣的:(力扣,算法)