最近正在學C++的遞迴,遇到了這個"求根號的二分逼進法"的問題,我試著帶5進去才打出這些code,但是執行出來卻是無限循環的 有沒有人可以幫我修改一下我那個副程式裡的bug,感謝各位!!! (p.s. error指的是誤差值)?

2017-07-23 10:35 pm

回答 (2)

2017-07-29 10:53 pm
✔ 最佳答案
#include<iostream>
using namespace std;
auto abs(auto a) {return (a>=0) ? (a) : (-a);}
auto clo(auto a, auto b, auto err){
return (abs(a*a-b) <= err) ? a : clo((a+b/a)/2, b, err);
}
int main(void){
float n;
double err;
for(; cout << "give me the N and err: "
&& cin >> n >> err
&& n > 1.0
;){
cout << "SQRT(" << n << ")=" << clo(n,n,err) << endl;
}
return 0;
}

1. 這可以不用遞迴 就可以做出來的.但是因為你是在練習遞迴 就不跟你說 簡易迴圈的做法了
2. 2分逼近 就是一個基本觀念:<根號一定是在a與(b/a)的中間>.你的城市看不出來你對這一點的認知.

CPP$ vim sqrt.cpp
CPP$ g++ sqrt.cpp -o sqrt -Wall -O3 -std=c++14
CPP$ ./sqrt
give me the N and err: 5 0.0001
SQRT(5)=2.23607
give me the N and err: 5 0.1
SQRT(5)=2.2381
give me the N and err: 7 0.1
SQRT(7)=2.65489
give me the N and err:
2017-07-31 9:34 pm
"clo((a+b/a)/2, b, err)"
這是牛頓法而不是2分法


收錄日期: 2021-04-30 23:06:31
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20170723143515AA3ljyM

檢視 Wayback Machine 備份