函數與指針5884
來自專欄 C語言代碼精簡及分析
感謝劉漢鑫同學的問題.
說這道題讀不懂?這道題出題是有問題的
應為
下面普及一下概念:
牛頓迭代法:利用遞推(目前咱們的做法)求得近似解.
迭代即後一項由前一項帶入遞推公式求得.題中的牛頓迭代公式即為本題的遞推公式.
簡單地說就是用計算機在演算,舉個例子
下面為此題代碼
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>void operation(double *n,int mark){ if(mark==1) *n=*n-(pow(*n,3)-pow(*n,2)-1)/(3*pow(*n,2)-2*(*n)); else if(mark==2) *n=*n-(pow(*n,4)-3*(*n)+1)/(4*pow(*n,3)-3); else if(mark==3) *n=*n-((*n)-exp(-(*n)))/(1+exp(-(*n)));//exp()是math.h下的函數,詳見書後附錄}void iteration(double *n,double remain,int mark)//iteration為迭代的意思,以後也會用到{ double ans; while(fabs(ans-*n)>remain) //ans存儲的是x(n),*n則是x(n+1),兩者差的絕對值用來判定迭代是否繼續 { ans=*n; operation(n,mark); }}int main(){ int mark; double n,remain; while(scanf("%d",&mark)!=EOF) { scanf("%lf%le",&n,&remain); iteration(&n,remain,mark); printf("%d %.2le %.5lf
",mark,remain,n);//此處是題目要求格式,不懂的先翻書 }}
ps.看不懂題要問,但如果一直問的問題都不是很有營養,那也不要怪別人嘲諷你呦(為以後嘲諷別人鋪墊hh)
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>//考慮到代碼的可讀性(其實是老師的建議),這版代碼將三種情況分寫為函數,並使用了switch語句//因為返回值只有一個故將形參從指針更正為普通變數,以區分指針使用的必要情況//一定要注意返回值!!!我在修改過程中就忘記了導致出錯double case1(double n){ return n-(pow(n,3)-pow(n,2)-1)/(3*pow(n,2)-2*n);}double case2(double n){ return n-(pow(n,4)-3*n+1)/(4*pow(n,3)-3);}double case3(double n){ return n-(n-exp(-n))/(1+exp(-n));//exp()是math.h下的函數,詳見書後附錄}double operation(double n,int mark){ switch(mark) { case 1: n=case1(n); break; case 2: n=case2(n); break; case 3: n=case3(n); break; } return n;}double iteration(double n,double remain,int mark)//iteration為迭代的意思,以後也會用到{ double ans; while(fabs(ans-n)>remain) { ans=n; n=operation(n,mark); } return n;}int main(){ int mark; double n,remain,ans; while(scanf("%d",&mark)!=EOF) { scanf("%lf%le",&n,&remain); ans=iteration(n,remain,mark); printf("%d %.2le %.5lf
",mark,remain,ans);//此處是題目要求格式,不懂的先翻書 }}
推薦閱讀:
※使用PyTorch從零開始構建Elman循環神經網路
※分段函數的複合函數要怎麼求(1)
※機器學習基礎——帶你走近機器學習
※算不盡購物網站折扣價,回頭看又是一年雙十一
※淺談機器學習時代的哈希演算法(一)