【数据结构】预备知识笔记

  1. 函数fun(int x),是寻找x的值

int func(int a[],int n){
    for(int i=0;i<n;++i){
        cout<<a[n];
    }cout<<endl;
    return 0;
};
int main(){
    int a[]={100,101,102};
    func(a,3);
}

比如如上代码,传递数组a给func的过程实际是:寻找a的值,因为a是数组,所以a的值等于数组首地址。所以如上函数等价于:

int func(int *p,int n){
    for(int i=0;i<n;++i){
        cout<<p[i];
    }cout<<endl;
    return 0;
};

指针指的是地址,给这个地址赋名为a,*p指向的是传入的数组a的首地址。

  1. 汉诺塔——递归例子

没想出来怎么用递归,但是很标准的栈,所以自己先用栈写了,通过最后的输出可以看出是符合我们要求的:

#include<iostream>
#include<stack>
using namespace std;
stack<int>c1;
stack<int>c2;
stack<int>c3;
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;++i){
        int tempnum;
        cin>>tempnum;
        c1.push(tempnum);
    }
    /*
    当盘子是乱序的时候,我们需要先给它们排好序才能挪动。
    不妨把三号柱设为排序柱,二号柱作为排序辅助柱
    当遇到一号柱顶端比三号柱顶端小时,将三号柱的顶端移至二号柱直到三号柱顶端比一号柱小
    然后将二号柱的东西再挪到三号柱
    另外当一号柱为空时,排序结束。
    */
    while(!c1.empty()){
        if(c3.empty()){
            c3.push(c1.top());
            c1.pop();
        }
        else{
            while(!c3.empty() and c3.top()>c1.top()){
                c2.push(c3.top());
                c3.pop();
            }
            c3.push(c1.top());
            c1.pop();
            while(!c2.empty()){
                c3.push(c2.top());
                c2.pop();
            }
        }
    }
    /*
    排序结束后则可以开始挪三号柱的东西,因为已经从大到小排序,根据stack的特性
    直接挪就好了
    如果从上往下从小到大是任意一个柱都可以的话,把使用辅助柱的条件改为大于即可。
    */
    while(!c3.empty()){
        c1.push(c3.top());
        cout<<c3.top()<<endl;
        c3.pop();
    }
}

上面有个大前提,就是说当盘子时乱序的时候,我不可能是固定操作,因为我需要给盘子排序。

现在不用栈,用递归。

假如盘子是正序的,即汉诺塔原题:把盘子从一柱挪到三柱,顺序不变。

老规矩,二柱是辅助柱。

我们不妨这么看:一共n个盘子,可以视作两个盘子:最底下当前需要挪到三柱的盘子和其它盘子。

因为n-1个盘子是一个整体,所以盘子顺序需要保持不变,因此需要借助辅助柱。

每次将最底下盘子挪动到三柱的无非是三个步骤:将其上n-1个盘子借助三柱正序放到二柱,将目标盘子放到三柱,将n-1个盘子借助三柱正序放到一柱。

#include<iostream>
using namespace std;
void hannoi(int n, int src, int mid, int tar){
    if(n==1){
        cout<<src<<"->"<<tar<<endl;
        return;
    }
    hannoi(n-1,src,tar,mid);
    hannoi(1,src,mid,tar);
    hannoi(n-1,mid,tar,src);
}
int main(){
    hannoi(3,1,2,3);
}

递归最重要的是:找到重复步骤,找到结束步骤。

其次编写递归函数中需要确定的是:重复步骤中有哪些参数在变?结束步骤的判断参数是谁?

递归很简单的,leetcode上很多题都是可以用递归几行搞定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值