Algorithm_01--C#递归算法02

递归算法本质:
1、方法的自我调用
2、有明确的终止条件
3、每次调用时,问题规模在不断减少。通过递减,最终到达终止条件

一列数的规则如下:1、1、2、3、5、8、13、21、34..求第30位数是多少


问题:斐波那契数列项数n (即题目所给的数列)

  1. 首先判断n=1或2时,直接返回1,这是递归终止条件。
  2. 若n>2,则继续递归调用:
    • Fib(n-1) 会一直递归调用直到n=1或2,得到上一项的值
    • Fib(n-2) 同样递归调用直到n=1或2,得到上两项的值
    • 将上一项和上两项相加,得到第n项的值,并返回
  3. 所以通过不断递归地求解更小的子问题,最终将达到能直接求解的问题,然后在递归回溯过程中把每个子问题的解累加,得到最终答案。

总结:对于递归,要明确终止条件,然后观察规律。

延申:循环迭代也可以解斐波那契数列

  1. 首先判断n=1或2时,直接返回1。这与递归算法相同。
  2. 定义3个变量:
    • first 保存上一项的值,初始化为1
    • second 保存上两项的值,初始化为1
    • sum 用来保存计算出的第n项的值
  3. 使用for循环,从第3项开始求解: //先定义了一二项,然后通过for循环迭代计算,更新一二项(first second)的值来进行计算
    • 先将上一项和上两项相加,得到第i项的值,赋给sum
    • 然后上一项的值赋给first,上两项的值赋给second
    • 这样在下一轮循环中,first和second就是更新后的上一项和上两项的值
  4. 循环执行,直到i=n,此时sum就是第n项的值,返回结果。
  5. 与递归算法相比,迭代算法通过定义变量保存每一步的中间结果,从而无需重复运算,效率更高,空间复杂度更小。空间复杂度是用来度量一个算法在运行过程中占用存储空间大小的一个指标。一般来说,空间复杂度小意味着一个算法在运行时占用的存储空间更少。此时,该算法可以被认为在空间利用率上更高效。说人话就是,递归简洁但是占用空间大,循环迭代复杂但是占用空间小。
posted @ 2023-05-24 09:42  压力小子の抗压日记  阅读(14)  评论(0编辑  收藏  举报