迭代

求斐波那契数列:

#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的话,就找不到解了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值