這段代碼是求解方程f(x)=0在區(qū)間[-10,10]上的根的數(shù)值解。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了睢陽免費建站歡迎大家使用!
方法的思想就是:一直選取區(qū)間中間的數(shù)值,如果發(fā)現(xiàn)中間的函數(shù)值與一側(cè)函數(shù)值,異號,那么說明解在這個更小的區(qū)間中,采用eps=1e-5作為區(qū)間的極限大小,通過迭代的方法求解這個方程的數(shù)值解。
所以了解了上述思想,那么else if(f(a)*f(c)0) b=c; 說明的是 f(a)和f(c)異號,那么使用b=(a+b)/2縮小迭代區(qū)間,繼續(xù)迭代;同理else a=c;說明f(a)和f(c)同號,那么使用a(a+b)/2縮小迭代區(qū)間,繼續(xù)迭代!
1、打開Python開發(fā)工具IDLE,新建‘search.py’。
2、F5運行程序,list1被正確排序,寫這個的目的是說明二分法查找必須前提是一個有序的列表,如果一開始無序首先要排序,當數(shù)據(jù)量大的時候,快速排序是一個很好的選擇,再進行二分法查找。
3、用遞歸的思想,遞歸就一定有結(jié)束條件。
4、if len(li)==1: ? #li長度等于1,只比較這個列表元素與要查找到值return li[0]==item。
5、if len(li)==0: #li長度等于0,全部查找結(jié)束還是沒有這個值? return False。
6、為程序添加main方法。
7、F5運行程序,正確打印出二分法查找結(jié)果,F(xiàn)alse True。
#includestdlib.h
void
sort(int
a[],int
n){
/*排序函數(shù),要使用二分法查找就必須對數(shù)組進行排序*/
int
i,k;
for(i=0;in;i++){
int
min=i;
for(k=i+1;kn;k++)
if(a[min]a[k])min=k;
if(i!=min){
a[min]+=a[i];/*這里是運用加減法交換兩個數(shù)*/
a[i]=a[min]-a[i];
a[min]-=a[i];
}
}
}
int
find(int
a[],int
n,int
key){/*二分法查找;參數(shù):數(shù)組名,數(shù)組長度,查找關(guān)鍵字*/
int
min=0,max=n-1;/*二分法查找頭尾變量*/
while(minmax){/*如果最頭的變量值大于最尾變量的值,則查找不到,查找失敗*/
int
cen
=
(min+max)/2;
if(a[cen]==key)
return
cen;/*如果查到,則返回關(guān)鍵字在排序數(shù)組的下標*/
if(cen==min
||
cen==max)break;/*如果中間變量等于頭尾任一個變量,同樣查找失敗*/
if(a[cen]key)
max=cen;
else
min=cen;
}
return
-1;
}
void
main(){/*主程序只是為了證明兩個函數(shù)的可行性,可以自己編寫*/
int
a[]={14,10,25,36,87,95,10,12,13,8},i;
sort(a,10);
i=find(a,10,11);
if(i!=-1)
printf("be
found");
else
printf("no
found");
getch();
}
舉個例子:
//二分查找法//
# includestdio.h
void main()
{
int a[16],i,num,flag=0,top,bottom,mid;
//定義一個一維數(shù)組a[16]用來存放供查找用的數(shù)據(jù),但只用a[1]——a[15]//
//num用來放要查找的數(shù)據(jù),flag是表示是否找到的開關(guān)變量,top表示查找的起始位置,bottom表示查找的終止位置,mid表示top與bottom的中間位置//
char goon;
//變量goon為'y'或'Y'時表示繼續(xù)下一輪查找,否則終止程序//
printf("請輸入第1個數(shù)字:\n");
scanf(" %d",a[1]);
//依次輸入第二到第十五個數(shù),并要求輸入的數(shù)遞減//
for(i=2;i=15;i++)
{
printf("請輸入第%d個數(shù)字:\n",i);
scanf(" %d",a[i]);
if(a[i]=a[i-1])
{
printf("請再次輸入,它應(yīng)該比上一個數(shù)?。篭n");
scanf(" %d",a[i]);
}
}
//輸出剛才輸入的數(shù)//
printf("你剛才輸入的數(shù)是:\n");
for(i=1;i=15;i++)
printf(" %d",a[i]);
printf("\n");
//查找循環(huán)開始//
do
{
printf("現(xiàn)在請輸入你要查找的數(shù):\n");//輸入想要查找的數(shù)//
scanf(" %d",num);
top=15;
bottom=1;
mid=15/2+1;
if(numa[1] || numa[15])//如果要查找的數(shù)據(jù)不在規(guī)定范圍內(nèi),令flag=1,輸出超出范圍的信息//
{
flag=1;
printf("你所要查找的數(shù)字不在范圍內(nèi)!\n");
}
while(flag==0 (top-bottom)0)//如果在規(guī)定的范圍內(nèi),開始二分法查找//
{
if(num==a[mid])//找到所需數(shù)據(jù),退出本層循環(huán)//
{
printf("你所要查找的數(shù)字是第%d個。\n",mid);
flag=1;
}
else if(numa[mid])//如果要查找的數(shù)據(jù)比a[mid]大,在前半數(shù)組查找//
{
top=mid+1;
mid=(top+bottom)/2;
}
else //如果要查找的數(shù)據(jù)比a[mid]小,在后半數(shù)組查找//
{
bottom=mid-1;
mid=(top+bottom)/2;
}
}
if(flag==0)//如果未找到數(shù)據(jù),輸出找不到的信息//
printf("無法找到你要找的數(shù)字!\n");
printf("是否繼續(xù)查找?(Y/N):\n");//詢問是否開始下一輪查找//
scanf(" %c",goon);
}while(goon=='y' || goon=='Y');
}