**
C++实现汉诺塔以及勒让德多项式
**
1、汉诺塔的实现
问题描述:有三根针A,B,C。A针上有n个盘子,盘子大小不等,大的在下,小的在上。要求把这n个盘子从A针移动到C针,在移动过程中可以借助B针,每次只允许移动一个盘子,且在移动过程中在三根针上都保持大盘在下,小盘在上。
分析:假设A针上只有一个盘子,那么就直接移动到C针上就可以了。考虑A针有两个盘子,就需要先把上面的的小盘先移动到B针上,再将大盘移动到C针,最后把B针上的小盘移动到C针上。那么对于有n(n>2)个盘子思路还是一样,先把上面的n-1个盘子移动到B针(借助C针),再把最后一个大盘移动到C针(不这样做的话最后的大盘没地方放啊!!)。再将B针上的n-1个盘子移动到C针(借助A针)。代码实现如下:
#include <iostream>
using namespace std;
void move(char first,char second){
cout << first << "-->" << second << endl;
}
//n表示有多少个盘子
void hanoi(int n,char left,char mid,char right){
if (n==1)
move(left,right);
else{
//先将n-1个盘子移到B盘上
hanoi(n-1,left,right,mid);
move(left,right);
//再将n-1个盘子从B盘移到C盘
hanoi(n-1,mid,left,right);
}
}
int main(){
int m;
cout<<"输入需要从A盘移动到C盘的数量:";
cin>>m;
cout<<"移动顺序为:"<<endl;
hanoi(m,'A','B','C');
return 0;
}
测试结果如下:
int main(){
int m;
cout<<"输入需要从A盘移动到C盘的数量:";
cin>>m;
cout<<"移动顺序为:"<<endl;
hanoi(m,'A','B','C');
return 0;
}
输入需要从A盘移动到C盘的数量:4
移动顺序为:
A-->B
A-->C
B-->C
A-->B
C-->A
C-->B
A-->B
A-->C
B-->C
B-->A
C-->A
B-->C
A-->B
A-->C
B-->C
2、编写函数求n阶勒让德多项式的值
问题描述:
分析:由上面的公式我们可以看到,勒让德多项式的终止条件是n=0和n=1,当n>1的时候就会产生递归。所以有这个思想可以编写递归函数如下:
#include <iostream>
using namespace std;
double taile(double n,double x);
double taile(double n,double x){
double f;
if(n==0){
f=1;
}
else if(n==1){
f=x;
}
else{
f = taile(n-1,x)*x*(2*n-1)/n-taile(n-1,x)*(n-1)/n;
}
return f;
}
int main()
{
double n;
double x;
cin >> n;
cin >> x;
cout<< taile(n,x);
return 0;
}
第一次写博客,有什么不对,或者大家不懂得地方欢迎讨论。