求斐波那契数列:
#include<stdio.h>
int main()
{
int a,b,c;
a=1;
b=2;
int n;
scanf("%d",&n);
for(i=3;i<=n;i++)
{
c=a+b;
a=b;
b=c;
}
printf("%d",c);
}
这个方法属于迭代,比用递归求斐波那契快些
普通递归:
#include<stdio.h>
int febo(int n)
{
if(n==1)
return 1;
else if(n==2)
return 2;
else
return febo(n-1)+febo(n-2);
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",febo(n));
}
这个重复计算了很多项,时间复杂度高,可以改进些,把之前计算过的项保存到数组,后面再计算的时候直接取值而非递归重复计算
改进递归:
#include<stdio.h>
#include<string.h>
int temp[1000];
temp[1]=1;
temp[2]=2;
int febo(int n)
{
if(temp[n]!=0)
return temp[n];
else
{
int avg;
avg=febo(n-2)+febo(n-1);
temp[n]=avg;
return avg;
}
}
int main()
{
memset(temp,0,sizeof(temp));
int n;
scanf("%d",&n);
printf("%d",febo(n));
}
都不如最开始的那个迭代好!
迭代的第二个例子:牛顿迭代求方程解
1.把方程f(x)=0改写成x=g(x)
2. 给定一个近似解x0,令x=x0,求g(x),若g(x)与x0差值小于精确度,则停止判断,方程解取x0,否则x=g(x),与g(x)再次比较
3.可能为死循环,无解,与近似值的选取有关,选的不好可能找不到解
#include<stdio.h>
#include<math.h>
//牛顿法解3x^2-4x=1,精确度0.1
float x0=1.0;
float Ep=0.1;
float g(float x)
{
return (3*x*x-1)/4;
}
float solve()
{
float x=x0;
x0=g(x);
while(fabs(x-x0)>Ep)
{
x=x0;
x0=g(x);
}
return x;
}
int main()
{
printf("%f",solve());
return 0;
}
这里的初值如果用2.0的话,就找不到解了