递归
今天上课讲了一些递归和迭代的例题 自己再写一遍
#include<bits/stdc++.h>
using namespace std;
#define eps 1e-8
int fact(int n)
{
if(n==1)return n;
return n*fact(n-1);
}
int gcd(int a,int b)
{
if(b==0)return a;
return gcd(b,a%b);
}
int sum;
void move(int n,int s,int t)
{
sum++;
printf("第%d步:把%d从%d移动到%d\n",sum,n,s,t);
}
void hano(int n,int s,int a,int t)//把第n个东西从s借助a移动到t
{
if(n==1)move(n,s,t);
else
{
hano(n-1,s,t,a);
move(n,s,t);
// hano(1,s,a,t);
hano(n-1,a,s,t);
}
}
long long fibb[100000];
long long fib(int i)
{
if(fibb[i])return fibb[i];
if(i==0||i==1)return 1;
return fibb[i]=fib(i-1)+fib(i-2);
}
double newtonsqrt(double x,double g)
{
// cout<<g<<endl;
if(abs(x-g*g)<eps)return g;
return newtonsqrt(x,(g+x/g)/2);
}
int nnfact(int x,int n,int p)
{
if(x==0)return 1;
if(x==n)return p*n;
return nnfact(x+1,n,p*x);
}
int main()
{
int x;
cin>>x;
cout<<fact(x)<<endl;
//阶乘
int nn;
cin>>nn;
cout<<nnfact(1,nn,1)<<endl;
//顺序实现的阶乘
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
//辗转相除
int m;
cin>>m;
for(int i=0;i<=m;i++)
printf("fib[%d]=%lld\n",i,fib(i));
//斐波那契
int n;
cin>>n;
hano(n,1,2,3);
cout<<"共需:"<<sum<<"步"<<endl;
//汉诺塔
double r;
cin>>r;
printf("%lf\n",newtonsqrt(r,1));
//牛顿迭代法求平方根
}