函数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的首地址。
汉诺塔——递归例子
没想出来怎么用递归,但是很标准的栈,所以自己先用栈写了,通过最后的输出可以看出是符合我们要求的:
#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上很多题都是可以用递归几行搞定