Философ Зенон и цикл for
Философ Зенон и цикл for
Посмотрим, как с помощью операции "запятая" можно разрешить старый парадокс. Греческий философ Зенон утверждал, что пущенная стрела никогда не достигнет цели. Сначала, говорил он, стрела пролетит половину расстояния до цели. После этого ей останется пролететь половину всего расстояния, но сначала она должна будет пролететь половину того, что ей осталось пролететь, и т. д. до бесконечности. Поскольку расстояние полета разбито на бесконечное число частей, для достижения цели стреле может потребоваться бесконечное время. Мы сомневаемся, однако, что Зенон вызвался бы стать мишенью для стрелы, полагаясь только на убедительность своего аргумента. Применим количественный подход и предположим, что за одну секунду полета стрела пролетает первую половину расстояния. Тогда за последующую 1/2 секунды она пролетит половину того, что осталось от половины, за 1/4 - половину того, что осталось после этого, и т д. Полное время полета представляется в виде суммы бесконечного ряда 1 + 1/2 + 1/4 + 1/8 + 1/16 -1- ... . Мы можем написать короткую программу для нахождения суммы первых нескольких членов.
/* Зенон*/
#define LIMIT 15
main ( )
{
int count;
float sum, x;
for(sum = 0.0, x = 1.0, count = 1; count <= LIMIT; count++, x *= 2.0)
{
sum + = 1.0/x;
printf(" sum = %f когдаcount = %d. " , sum, count);
}
}
В результате выполнения программы получим значения сумм, соответствующих первым 15 членам ряда:
sum = 1.000000 когда count = 1.
sum = 1.500000 когда count = 2.
sum = 1.750000 когда count = 3.
sum = 1.875000 когда count = 4.
sum = 1.937500 когда count = 5.
sum = 1.968750 когда count = 6.
sum = 1.984375 когда count = 7.
sum = 1.992188 когда count = 8.
sum = 1.996094 когда count = 9.
sum = 1.998047 когда count = 10.
sum = 1.999023 когда count = 11.
sum = 1.999512 когда count = 12.
sum = 1.999756 когда count = 13.
sum = 1.999878 когда count = 14.
sum = 1.999939 когда count = 15.
Можно видеть, что, хотя мы и добавляем новые члены, сумма, по-видимому, стремится к какому-то пределу. И действительно, математики показали, что при стремлении числа членов к бесконечности сумма ряда сходится к 2,0, что и демонстрируется нашей программой. Какая радость! Если бы Зенон оказался прав, движение было бы невозможно. (Но если бы движение было невозможно, то не было бы Зенона ).
Что можно сказать по поводу самой программы? В ней показано, что в одном выражении можно использовать более, чем одну операцию "запятая". В спецификации цикла мы инициализировали переменные sum, x и count. После задания условий выполнения цикла оставшаяся часть программы оказывается очень короткой.