PDA

View Full Version : Спешна помощ със задача с++



vpowerrr
11-14-2012, 17:42
Здравейте, от одеве умувам върху една задача, която е следната:
Да се напише рекурсивна функция, която пресмята корен квадратен от х, х>=0 по метода на Нютон.
и упътване: дефинира се редица от реални числа у0,у1,у2... по следния начин. у0=1;
Yк+1=0,5(Yк+Х/Yк), к=0,1,2....
пресмятането продължава до намиране на Yк, така че |Yк^2-x|<е, където е(епсилон)>0 едадено достатъчно малко реално число. (аз го разбирам нещо като 0<е<1/2, примерно...) ако някой ми помогне бих бил доста благодарен :)
Мерси!

anonymous546178
11-17-2012, 18:23
еми, че то няма какво да му мислиш.. тя задачата ти е измисленя вече, трябва само да я преведеш на съответния език

MaGuSs
11-17-2012, 18:54
http://forums.data.bg/index.php?showtopic=1137227

vpowerrr
11-17-2012, 21:30
еми, че то няма какво да му мислиш.. тя задачата ти е измисленя вече, трябва само да я преведеш на съответния език
Та нали това е за което питам...

MaGuSs
11-17-2012, 21:47
Та нали това е за което питам...

Ако можеш да ми обясниш това за решението на Нютон, така че да го разбера, може да ти напиша фукнцията.

calinca
11-18-2012, 00:08
Ок, понеже изобщо не става ясно какво ти е ясно, ще карам много подробно, започвайки с условието.

Търсим корен на някакво, очевидно дадено, X. Хубаво. Значи търсим такова Y, което е решение на уравнението Y * Y = X, което е еквивалентно на Y * Y - X = 0. Супер, едно уравнение, едно неизвестно, задачата вероятно е решима.
Гледаме си условието на задачата. Има там някаква рекурсивна сметка за Y, на която засега не обръщаме внимание. Имаме условие - Y е намерено, когато |Y * Y - X| < E. Хм, то това почти като нашето уравнение. Само дето не е съвсем точно, явно търсим някакво приближение. Ок, значи това Е е някакъв мерител на точността. След като не ни е казано, логично е потребителят на функцията да ни го подава, т.е. то е някакъв параметър. (Един вид, ако примерно търсим корен от 2, което е ирационално число, т.е. безкрайна непериодична дроб, това Е ни казва колко дълго да смятаме, до каква точност да стигнем. Изобщо не ни интересува как това Е е свързано примерно с броя на цифрите след десетичната запетая, които ще върнем. Който дава Е-то, той да се грижи за тая подробност, нашата задача е друга.) Супер, едно неравенство, едно неизвестно (знаем X, знаем Е). Това ще ни е дъното не рекурсията, т.е. онзи случай, в който няма отново да си викаме функцията, а ще кажем: ето, намерихме каквото се искаше, стига толкова. Ако, пресмятайки последователно Y по оная горната формула, на която не обръщаме вминание, сме стигнали до такова Y, което да удовлетворява това неравенство, значи сме си свършили работата.
Е, сега остава само да смятаме, докато стигнем до него. Как? Първото Y според условието е 1. Върши ли работа? Дали |1 * 1 - X| < E? Ако да, сме готови. Ако не, смятаме новото Y по дадената формула. Върши ли работа? И т.н.

Горното е условието. Към момента вече наистина би трябвало да можеш да си го преведеш на произволен език за програмиране, стига да познаваш езика, ако си писал рекурсия. Ако не си, не знам. Не съм педагог. Не съм наясно как би следвало да се обясняват такива неща и не знам дали го мога.

На някакъв измислен в момента псевдокод функцията би изглеждала примерно така:
function(X, Y, E)
begin
if |Y * Y - X| < E then return Y
else return function(X, (Y + Y / X) / 2, E)
end

Очаква се да се извика с:
function(<реална стойност на X>, 1, <реална стойност на исканото приближение Е>)

Идеята е: викаш функцията, като най-нагло заявяваш дадената ти стойност за Y, т.е. 1. Нищо, че вероятно грам няма нищо общо с очаквания отговор. В else-клаузата, т.е. точно тогава, когато това Y не е достатъчно точно, функцията отново ще извика себе си, само че този път вместо старото Y ще подаде ново, по-точно, в термините на условието на задачата това ще е следващият член на редицата. И ще продължи да прави това, докато Y не стане достатъчно точно; в момента, в който това се случи, връща резултата, за това се грижи if-клаузата.

Оттук нататък вече наистина всичко е само синтаксис. Ако и това не е ясно, опасявам се, че аз няма да помогна без физическото присъствие на: 1. някакъв вид дъска/лист/друго платно за писане, 2. съответното писало, 3. твоята персона.