练习1. 顺序打印整数的每一位数
这个题的意思就是,输入一个整数,如520,然后顺序打印每一位的数字,就是先打印5 再打印2 最后打印0。
这个的代码可以依靠递归来很好的实现。
首先来上代码:
很简短的代码,所谓递归就是不断的调用函数自己。
在 sequence_print(int n) 函数中,线做一个判断,if(n > 9),就进行递归。其逻辑上,当我们输入520的时候,520 > 9, 然后再进入函数,此时参数变成 n/10, 也就是 52 进入函数,52 > 9, 再进入函数,参数变成了 5, 此时 5 < 9,开始打印:先打印 5%10 == 5;然后回到参数为 52 的时候的函数,打印 52%10 == 2; 再回到参数为 520 时候的函数,打印 520%10 == 0;
最后呈现的就 5 2 0,整体思想就是先递,再归的过程。
当满足 n > 9的条件时,无限进入 sequence_print(n/10), 当不满足条件时,再依次回去。
如果还是不太懂,我上一篇关于递归的文章中有图,大家可以看一下。
练习2. 斐波那契数列
关于这个题目,首先我先解释一下什么是斐波那契数列:也就是每一项是前两项的和。
比如计算截止到第五位的斐波那契数列的和,就是0 1 1 2 3: 0+1=1,1+1=2,1+2=3,2+3=5
5 的前两项是 2 和 3, 3 的前两项是 2 和 1 …………
那么就直接先上代码:
输入 n ,代表计算截止第n位的斐波那契数列的结果,比如我们输入 n = 6,那么就是计算到第六位,应该是 0+1=1,1+1=2,1+2=3,2+3=5,3+5=8
现在我们来盘一下里面的逻辑,首先,我们输入 n=5,也就是计算到第五位
然后 n 进入函数,判断 != 0 也 != 1,然后再进入函数,参数变成了n-1和n-2,就是 Fib(4) 和 Fib(3) ,都不满足条件,继续进入,Fib(4) 分成了Fib(3) 和 Fib(2);Fib(3)分成了Fib(2) 和 Fib(1);然后每个再分裂,直到满足判断条件,Fib(1) == 1,Fib(0) == 0,Fib(2) == Fib(1)+Fib(0),Fib(3) == Fib(1)+Fib(2)…………直到回到 Fib(5) == Fib(4)+Fib(3),最后计算完毕,返回值。
所以虽然我们计算使步骤不多,但是在递归中会不断的分裂。如果我们要计算第50位,那就是个非常庞大的计算量了,如图:
所以递归虽然看起来减少了代码量,但是其需要的计算量却非常庞大,其中包含很多的重复计算。所以一般推荐步骤很多的计算采用迭代(循环)来解决,步骤少的计算可以用递归。
小结:
递归是一种大事化小的思想,但也会产生不必要的重复计算,因此要合理使用递归和迭代。
最近作业很多,所以断更很长时间,接下来会不定时更新关于 Java语法 和 C语言指针 相关的知识。