172210704111-陈国佳总结《2017年11月30日》【连续051天】
标题:this指针和放苹果;
内容:A.this指针:
C++到C的翻译:当我们用C++的类的概念时,可以将其翻译到C,
其中,成员函数会多一个this指针参数:
C++: class A{}; void A::Set(int p){;}
C: struct A{}; void Set(struct A*this,int p){ ;}
this指针的作用就是指向成员函数所作用的对象
非静态成员函数中可直接使用this来代表指向该函数作用的对象的指针;
class A
{ int i;
public:
void Hello(){
cout<<"hello"<<endl;
} //void Hello(A*this){cout<<"hello"<<endl;}
};
int main()
{
A*p=NULL;
p->Hello(); //Hello(p);
}输出:hello ;
若将上式改为:
void Hello(){
cout<<i<<"hello"<<endl;
} //void Hello(A*this){cout<<this->i<<"hello"<<endl;}
而在mian函数中this为空,报错;
B.放苹果:
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(注意:5,1,1和1,5,1是一种分法);
解析:
我们假设i个苹果放在k个盘子里放法的总数是f(i,k),则;
k>i时,f(i,k)=f(i,i),(必有(k-i)个盘子空着,可排除它们)
k<=i时,总放法=有盘子为空的放法+没盘子为空的放法;
f(i,k) =f(i,k-1)+f(i-k,k) (有盘子为空,可假设为至少有一个盘子为空的方法;当没盘子放空时,必有每个盘子先放一个,任何在任意放多出来的)
边界条件:防止k或i小于0;
nt f(int i,int k){
if(i<k)
return f(i,i);
if(i==0)return 1;
if(k<=0)return 0;
return f(i,k-1)+f(i-k,k);
}
int main()
{
int m,n;
cin>>m>>n;
cout<<f(m,n)<<endl;
return 0;
}
明日计划:;