递归

· · 个人记录

先将明白一点四点

•递归是一种思想。

•递归是一种思维方式。

•递归是一种算法。

•一个函数直接或间接调用自己——递归函数

递归是个神马东西?

OS:它不是个东西

• 原始问题可转化为:解决方法相同的新问题, 新问题的规模比原始问题小

• 新问题又可转化为解决方法相同的规模更小 的新问题。

• 上述过程不能无限进行。

• 这种解决问题的方法是递归方法。

好像没用……(其实就是没用)

程序设计中的递归方法

• 通过函数调用自己本身,实现将问题转化为本质 相同,但规模较小的子问题的方法。

• 如果是直接调用自身,称为直接递归;如果是通 过其它函数间接调用自身,则称为间接调用。

我自己都不明白

直接递归长成这个样子ヾ(❀^ω^)ノ゙

int abc()
{
    ……
    abc ()
    ……
}

直接递归长成这个样子^(* ̄(oo) ̄)^

int abc ()
{
    ……
    xyz()
    ……
}
int xyz()
{
    ……
    abc()
    ……
}

上点栗子

(・◇・)?数楼梯(⊙_⊙)?

这题高精,so直接用下面的代码是过不了的--O(∩∩)O哎嘿~_

• 一个含有n阶的楼梯,一次可以走1阶或2阶,从底走到顶一共有 多少种走法?

• 输入:台阶数n

• 输出:不同走法种数

• 输入样例:3

• 输出样例:3

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<string>
#include<cmath>
#include<stack>
#include<deque>
#include<map>
//#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
int a=1,b=2,c;
int main() 
{
    //freopen("fruit.in","r",stdin);
    //freopen("fruit.out","w",stdout);
    ios::sync_with_stdio(false);
    while (cin>>n)
    {
        if (n==0)
        {
            cout<<0<<endl;
            return 0;
        }
        if (n<3)
        {
            if (n==1)
            {
                cout<<1<<endl;
                return 0;
            }
            else
            {
                cout<<2<<endl;
                return 0;
            }
        }
        for (int i=3;i<=n;i++)
        {
            c=a+b;
            a=b;
            b=c;
        }
        cout<<c<<endl;
        a=1;b=2;
    }

    return 0;
}

我把代码放前面了……

┏┛墓┗┓...(((m-__-)m…………

思路应该有人看吧

先找递归式

1阶楼梯时

只有1种可能——1步直接上去;

2阶楼梯时

有2种可能——1步走两次,或2步走一次上去;

3阶楼梯时

有3种可能——每次都走1级,第1次走1级,第2次走2级;第1次走2级,第2次走1级;

可以得出一个递归式:a[i]=a[i-1]+a[i-2];

(这里i保证大于3,i相当于c,i-1相当于b,i-2相当于a)

长得挺像递推的(^-^)V

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<string>
#include<cmath>
#include<stack>
#include<deque>
#include<map>
//#include<bits/stdc++.h>
#define ll long long
using namespace std;
int step (int n) {
    if (n==1 || n==2)
        return n;
    return step(n-1)+step(n-2);
}
int main() {
    //freopen("fruit.in","r",stdin);
    //freopen("fruit.out","w",stdout);
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    cout<<step(n);
    return 0;
}
这里才是真正的递归代码O(∩_∩)O哈哈~

来个简单的荔枝

1

2

3

4

kkksc03考前临时抱佛脚 咦嘿嘿(^▽^) 、O(∩_∩)O哈哈~、o(^@^)o

别走(ToT)/~~~憋走

最后讲一些些……

递归就剩一个优点——逻辑清晰(套话而已)代码简单(就是有点废人︿( ̄︶ ̄)︿)

• 递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如f(n)=f(n-1)+f(n-2)的递归实现。

• 调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。

• 递归由于是函数调用自身,而函数调用是有时间和空间的消耗的,每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。

so:一般哈,一般情况下,递归的题(考试时),代码复杂,内存大,用时长,极为复杂,but是DFS的只因础,属于不会就废的内容︿( ̄︶ ̄)︿。

不要抄题解,不然就会像宋延浩一样

ps:没说宋延浩抄题解,只是抄题解会向他一样