剑指offer笔记递归和循环

Posted AllenSquirrel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer笔记递归和循环相关的知识,希望对你有一定的参考价值。

递归和循环

什么是递归?

递归就是在一个函数内部调用函数本身

什么是循环?

循环通过设置计算初始值及终止条件,在此范围内重复计算

举例说明一下:

1+2+3+...+n求和

//循环
int sum(int n)
{
    int res=0;
    for(int i=1;i<=n;i++)
    {
        res+=i;
    }
    return res;
}

//递归
int sum(int n)
{
    return n==0?0:n+sum(n-1);
}

从上述代码可以明显感觉到:递归简洁明了

但递归也存在一定的不安全性:

(1)我们都知道函数调用需要在内存栈中分配空间以保存参数,返回地址及临时变量,以及数据压栈和出栈都需要时间,而递归每一次调用函数本身都需要时间和空间开销

(2)递归本质是分治思想,化大为小,但如果小问题如果存在相互重叠部分,导致很多计算都是重复

(3)每一次函数调用在内存中分配空间,而每个进程的栈容量都是有限,调用层数过多就会导致栈溢出

一说起递归,或许大家都可以想到最为经典的斐波那契数列

//递归
int fibonacci(int n)
{
    if(n<=0)
        return 0;
    if(n==1)
        return 1;
    return fibonacci(n-1)+fibonacci(n-2);
}

//迭代
int fibonacci(int n)
{
    if(n<2)
        return n;
    int f1=0;
    int f2=1;
    int fn;
    for(int i=2;i<=n;i++)
    {
        fn=f1+f2;
        f1=f2;
        f2=fn;
    }
    return fn;
}

上述代码中,第一种为递归实现,第二种为利用递归思想通过循环迭代实现,递归实现虽然简单,但是如果n过大就会导致时间复杂度过高,甚至导致栈溢出,其主要原因就是存在过多重复计算,采用第二种方法有效保存已经计算过的结果,大大降低时间复杂度

以上是关于剑指offer笔记递归和循环的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-斐波那契数列-递归和循环-python

剑指offer

剑指offer

剑指offer:数值的整数次方

剑指offer思路总结

刷题笔记| 快速刷完67道剑指offer(Java版)