1、打开Python开发工具IDLE,新建‘search.py’。
创新互联公司是一家专业提供江孜企业网站建设,专注与成都网站设计、做网站、H5开发、小程序制作等业务。10年已为江孜众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
2、F5运行程序,list1被正确排序,写这个的目的是说明二分法查找必须前提是一个有序的列表,如果一开始无序首先要排序,当数据量大的时候,快速排序是一个很好的选择,再进行二分法查找。
3、用递归的思想,递归就一定有结束条件。
4、if len(li)==1: #li长度等于1,只比较这个列表元素与要查找到值return li[0]==item。
5、if len(li)==0: #li长度等于0,全部查找结束还是没有这个值 return False。
6、为程序添加main方法。
7、F5运行程序,正确打印出二分法查找结果,False True。
/*
二分法,适用于原函数是单调递增或单调递减,即方程只有1个根,
或在指定区间只有1个根
*/
//函数y( x),直接按题目中的方程写
double y(double x)
{
return 2*x*x*x -4*x*x +3*x -6;
}
//递归调用函数,这种调用多少次不一定的函数,
//用递归调用最简单,但要掌握递归技巧
double f(double x1,double x2)
{
double xm = (x1+x2)/2.0;
if( (x2-x1) 0.0000001) //预先设定的很小的数值,控制计算精度
{
return xm; //递归调用出口
}
if( y( xm ) 0 )//用xm 代替x2
{
f( x1,xm);
}
else ////否则 用xm 代替x1
{
f( xm,x2);
}
}
void main()
{
double x1,x2;
x1 = -100000;
x2 = +100000;//取+ - 2个较极端的数,保证y(x1)0,且y(x2)0
printf("%7.3lf",f(x1,x2));
}
) 用二分法求下面方程在(-10,10)之间的根。 2x3-4x2+3x-6=0【提示】(1) 取两个不同点x1、x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根(曲线与x轴的交点)。如果f(x1)与f(x2)同符号,则应改变x1、x2,直到f(x1)、f(x2)异号为止。注意x1、x2的值不应相差太大,以保证(x1,x2)区间只有一根。
(2) x1和x2两点之间的中点x=(x1+x2)/2,见图4-1,再从x求出函数值f(x)。
(3) 若f(x)与f(x1)同符号,则根必在(x,x2)区间内,此时将x作为新的x1;如果f(x)与f(x2)同符号,则表示根在(x1,x)区间内,将x作为新的x2。
(4) 重复步骤(2)和(3),直到|f(x)|ε为止,ε为一个很小的数。此时认为f(x)≈0,x即为根。
根据上述思路画出N-S流程图,如图4-2所示。源程序命名为p5_8.c。
#include math.h
#include stdio.h
double fun(double x) { return 2 * x * x * x - 4 * x * x + 3 * x - 6; }
double root(double a, double b, double e)
{
double x1, x2, y1, x, y;
x1 = a; x2 = b;
do {
x = (x1 + x2)/2;
y = fun(x);
y1 = fun(x1);
if( ( y 0 y1 0) || (y 0 y1 0) )
x1 = x;
else
x2 = x;
/*end if*/
}while(fabs(y) e);
return x;
}
int main(void)
{
double x = root(-10.0f, 10.0f, 1e-8);
printf("%f\n", x);
return 0;
}
这段代码是求解方程f(x)=0在区间[-10,10]上的根的数值解。
方法的思想就是:一直选取区间中间的数值,如果发现中间的函数值与一侧函数值,异号,那么说明解在这个更小的区间中,采用eps=1e-5作为区间的极限大小,通过迭代的方法求解这个方程的数值解。
所以了解了上述思想,那么else if(f(a)*f(c)0) b=c; 说明的是 f(a)和f(c)异号,那么使用b=(a+b)/2缩小迭代区间,继续迭代;同理else a=c;说明f(a)和f(c)同号,那么使用a(a+b)/2缩小迭代区间,继续迭代!
二分法计算函数f(x)=x*x*x*x+2*x*x*x-x-1;
本程序在turbo c或c++下编译
#include "stdio.h"
#include math.h
float f(float x)
{float y;
y=x*x*x*x+2*x*x*x-x-1;
return y;
}
void main()
{float a=0,b=0,h,y,x;
int k,n0;
printf("please input qujian a and b");
scanf("%f%f%d",a,b,n0); /*输入含根区间a,b,循环次数n0 */
for(k=0;k=n0;k++)
{ x=(a+b)/2;
h=(b-a)/2;
y=f(x);
if(h10e-6||fabs(y)10e-6)
{ printf("k=%d,x=%f,y=%f",k,x,y);
break; } /*输出分半次数k,函数的根x,及x对应的函数值.*/
else
{if(f(a)*f(x)0)
b=x;
else a=x;
}
}
}
这段代码是求解方程f(x)=0在区间[-10,10]上的根的数值解。
方法的思想就是:一直选取区间中间的数值,如果发现中间的函数值与一侧函数值,异号,那么说明解在这个更小的区间中,采用eps=1e-5作为区间的极限大小,通过迭代的方法求解这个方程的数值解。
所以了解了上述思想,那么else
if(f(a)*f(c)0)
b=c;
说明的是
f(a)和f(c)异号,那么使用b=(a+b)/2缩小迭代区间,继续迭代;同理else
a=c;说明f(a)和f(c)同号,那么使用a(a+b)/2缩小迭代区间,继续迭代!