Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

[ Миронченко ] Императивное и объектно-ориентированное програмирование на Turbo Pascal и Delphi

.pdf
Скачиваний:
68
Добавлен:
25.04.2014
Размер:
3.16 Mб
Скачать

381

программы, которая представляет собой просто последовательность операторов. Конечно, теперь в ней вызываются методы глобальных объектов, однако основная программа все равно представляет собой не главный класс – а лишь основную подпрограмму, которая оперирует с объектами. Более того, программист то и дело должен использовать функции ОС, которые не принадлежат ни к каким объектам. То, что в Delphi есть класс TApplication, который берет на себя добрую часть взаимодействия с ОС, и целая библиотека встроенных классов в придачу, не должно вводить нас в заблуждение относительно их содержимого – все они должны использовать функции ОС.

Мы обсудили программный код, теперь давайте рассмотрим программу во время выполнения. Как только программа скомпилирована и запущена на выполнение, она понимается ОС не как набор классов, а как процесс, который состоит из ряда потоков (в Windows потоки делятся еще и на волокна), у которого есть свое адресное пространство, сегмент стека и т.д. Короче, появляется целый ворох понятий, относящихся непосредственно к жизненному циклу программы.

Объекты времени выполнения (ОВВ) – понятия, описывающие работу программы.

Вчастности, процесс, поток, волокно, - ОВВ.

Взаимодействие программы с операционной системой

Вглаве 14 мы определили понятие операционной системы так:

ОС – программа, являющаяся прослойкой между аппаратным обеспечением и прикладными программами и предоставляющая функции, позволяющие прикладным программам работать с аппаратным обеспечением и взаимодействовать друг с другом.

Т.е. ОС – это нечто большее, чем обычная прикладная программа.

Механизм сообщений, многие объекты времени выполнения, дополнительные

понятия, которые служат лишь для поддержки «новых технологий», сильно загромождают язык. Все это говорит лишь о том, что должны меняться принципы программирования, которые не развивались со времен Simula и Smalltalk.

Часто ставится вопрос о возможно большей независимости программ от ОС. Но уже сама его постановка говорит о том, что ОС является чем-то отличным от обычной прикладной программы. В рамках существующих концепций программирования не может быть дано удовлетворительное определение того, что такое ОС – это понятие всегда оставалось внешним.

19.5. Несколько терминов из биологии

Объектно-ориентированное программирование родилось (язык Simula 67) из благого стремления людей исследовать мир, поэтому не удивительно, что многие термины ООП пришли из биологии. Даже понятие функции стало пониматься не в математическом (как в процедурном программировании), а в биологическом смысле:

Функция – специфическая деятельность животного или растительного организма, его органов, тканей и клеток.

Полиморфизм –

382

1.способность некоторых кристаллических веществ образовывать в зависимости от условий несколько различных по кристаллической структуре и другим физическим свойствам модификаций без изменения состава вещества (графит – алмаз).

2.Наличие в пределах одного того же вида животных или растений особей, резко отличающихся друг от друга; различают половой, возрастной, сезонный и связанный с чередованием поколений; у растений полиморфизмом называют также наличие у одной особи различных форм какого-либо органа.

Мы продолжим традицию использования биотерминов, и вспомним еще несколько:

Генетический код – запись наследственной информации в виде последовательности кодонов.

Кодон – единица генетического кода, состоящая из трех азотистых оснований (нуклеотидов). Кодон предписывает включение определенной аминокислоты в синтезируемую молекулу белка.

Фенотип – совокупность всех признаков и свойств организма, сформировавшихся в процессе его индивидуального развития.

Сточки зрения программиста, генетический код существа – программа, кодон – элементарная команда (она анализируется информационной РНК).

Нам понадобятся эти понятия, когда мы введем понятие существа (Wesen).

19.6 Везенспрограммирование (Wesensprogrammierung)

Основные понятия

Основным понятием ООП было понятие класса. Инкапсуляция реализована на уровне классов, а не объектов: объект класса А может изменять в своих методах значения private-полей любого другого объекта класса А.

Объект – производное понятие: объект - экземпляр класса.

Базовым понятием везенспрограммирования (ВП) будет понятие существа (Wesen). Существо – аналог объекта. Его описание (аналог класса) – назовем

Metawesen.

Wesen состоит из трех частей:

1.Hirn (мозг)

2.Inwelt (внутренний мир)

3.Zutritte (входы)

Каждое существо живет в своем собственном потоке.

Metawesen описывается так: type

MW = Metawesen

Hirn:THirn

Inwelt:

end;

Hirn – это объект, своеобразный центр управления у существа.

383

Inwelt – это внутренний мир существа. Внутренний мир существа может состоять как из объектов, так и из других существ.

Zutritt (вход) – единственное средство, с помощью которого существо может принимать информацию от других существ. Объекты ничего не могут посылать существам, они - лишь источник данных (как в ООП).

Для того чтобы посылать информацию другим существам, вводится понятие

вызова (Ruf). Чтобы принимать информацию, существо должно включить входы («настроиться на волну»). Если существо не хочет принимать информацию извне, то входы блокируются.

Информация, которую получает существо, может храниться внутри Hirn в какойто структуре данных. По мере надобности Wesen может анализировать полученную информацию.

У каждого существа есть Inwelt, в котором могут жить другие существа, к которым существо, в котором они живут, может обращаться лишь при помощи вызовов. С другой стороны, каждое существо тоже обитает в Inwelt какого-то другого существа.

Если существо А находится в Inwelt существа В, то В называется надсуществом

(Oberwesen) существа А.

Inwelt надсущества для существ, которые в нем обитают, будет называться Umwelt (окружающий мир).

Если бы каждое существо должно было бы обитать в некотором надсуществе, то получилась бы бесконечная последовательность надсуществ. Этого быть не может, поэтому есть главное существо (Hauptwesen, HW), которое не входит в Inwelt какого бы то ни было надсущества. Это главное надсущество – как вы уже догадались, и есть то, что в старину называли ОС.

Заметьте, что понятие главного существа не является для везенспрограммирования внешним, и при этом оно полностью соответствует старому понятию ОС:

Все существа, обитающие в инвельте главного существа не могут непосредственно получить доступ к аппаратуре, следовательно, главное существо скрывает аппаратуру и предоставляет возможность обращаться к ней, используя его функции.

Существа, обитающие в инвельте главного существа могут общаться друг с другом (через главного существа).

Т.к. каждое существо живет в собственном потоке, то выходит, что главное существо распределяет ресурсы между ними.

Таким образом, существование главного существа является необходимым следствием концепции везенспрограммирования, а не каким-то внешним понятием, взятым непонятно откуда.

Жизнь существа

Итак, каждое существо обитает в окружающем пространстве (Umwelt). Кроме того, у каждого существа есть внутреннее пространство (Inwelt).

Во внутреннем пространстве существо может обращаться к любому из объектов, а к существам, которые в нем живут, может обращаться при помощи вызовов. Существо может создавать своих подсуществ и уничтожать их.

384

ВUmwelt права существа более ограничены: обратиться к другим существам оно может с помощью вызовов к ним. А обращение к объектам Umwelt можно проводить через вызов к надсуществу, которое руководит «мертвой материей» в своем Inwelt.

Вас не должна смущать некоторая громоздкость обращения к внешним объектам. Во-первых, очень маловероятно, что на уровне существ будут встречаться целые числа или какие-то простые объекты. Наверняка объектами, с которыми работает существо, являются какие-то базы данных, файлы и т.д. Когда мы в программах обращались к файлу, то мы в конечном счете использовали функции ОС, поэтому обращение к надсуществу – это просто обобщение тех механизмов, которые и так используются.

Вто же время ввод посредника позволяет сделать существо более независимым от окружения. Мы еще обсудим этот тонкий момент позже, а пока что попрошу вас заметить, что мы уже говорим о существах, как о чем-то живом, т.к. они существуют в своем потоке и живут своей жизнью.

Подытожим, чего мы уже добились:

обособленности (выполнение в собственном потоке)

самостоятельности (независимость от других существ и внешних объектов)

полной инкапсуляции (повлиять на существо можно лишь с помощью вызовов и то если оно само того хочет).

Давайте посмотрим, как ВП избавляет программиста от ненужных терминов.

Убираем ненужные технические понятия

Когда программист пишет программу согласно традиционной методологии программирования (т.е. не используя ВП), он использует множество понятий, которым нет прямых аналогов в природе: процесс, поток, программа, операционная система. Совершенно очевидно, что значения слов «процесс» и «поток» в программировании и обиходной речи различаются.

В ВП ситуация иная: существо (Wesen) живет, обмениваясь информацией с окружающей средой (Umwelt), которую обрабатывает мозг (Hirn) этого существа. Все эти понятия в ВП полностью соответствуют понятиям из реальной жизни, поэтому они гораздо яснее, чем притянутые за уши технические термины. Даже понятие программы теперь может быть выражено так:

программа - генетический код существа.

генетический код – последовательность выполняемых неделимых команд.

Для живых существ код выполняется в клетке, а для информационных – в

процессоре.

Существо ссылается на дескриптор Metawesen, который ссылается на методы, которые есть у всех существ этого Metawesen. Программный код, описывающий Metawesen – это описание генетического кода существа.

Сам «генетический код» существа – это последовательность команд, которая отводится под само существо, вместе с дескриптором Metawesen и описанием мозга (Hirn). Заметьте, что даже понятие программы – последовательности команд в ВП заменяется «генетическим кодом существа».

Фенотипом существа будет генотип + переменные, которые использует существо во время работы (дополнительная память).

В таком случае процесс – это фенотип существа, обитающего в ОС.

385

Давайте приведем небольшую таблицу, в которой сравним некоторые старые и новые понятия:

 

Старые понятия

Новые понятия

1.

программа

генотип существа

2.

процесс

фенотип существа

3.

поток

не используется

4.

Операционная система (ОС)

Hauptwesen (HW)

5.

написать программу

описать существо

6.

запустить программу

добавить существо в среду

7.

сообщения

вызовы

Понятие потока в явном виде вообще не используется, т.к. поток неразрывно связан с существом. Конечно, иногда существу нечего делать, то надо дать ему возможность «впадать в спячку». Выход из нее можно реализовать по-разному: например, как только будет накоплено достаточное количество входных данных, то он может проснуться и обработать входную информацию.

Читатель может возразить что, принимая везенспрограммирование, мы хотя и избавляем программиста от старых понятий, но при этом вводим взамен новые. Но на самом деле мы не вводим новые термины, а лишь расширяем значение уже давно известных биологических понятий на информационный мир, что естественнее и, следовательно, правильнее.

Описание существ на разных языках

При включении компьютера автоматически рождается существо – Hauptwesen. Его Inwelt может быть изначально пустым. Во время работы оно (Hauptwesen) может добавлять в свой Inwelt другие существа (по собственной инициативе или по приказу пользователя). Каждое из этих существ также может впоследствии пополнять свой Inwelt различными существами.

Программист, если хочет описать новое существо (раньше мы бы сказали: написать новую программу), пишет Metawesen. После его компиляции создается файл с кодом, описывающим Metawesen. Операция добавления нового существа в Inwelt какого-то другого существа заключается в том, что должен быть запущен метод, который создает существо (назовем его Leben - жизнь), а код Metawesen подключится в Inwelt существа.

Т.к. существа связаны с внешним миром (и с внутренними существами) лишь посредством вызовов, то для того, чтобы можно было описывать существа на разных языках, надо лишь:

1.Общий механизм обработки вызовов

2.Общий механизм добавления существ в среду.

При выполнении этих условий существа можно будет описывать на любых

языках программирования.

Оба эти условия нужны и для традиционного подхода к выполнению программ (они проявляются в том, что все программы должны быть в состоянии выполняться под управлением ОС).

386

Общая картина

На каждом компьютере есть Hauptwesen – главное существо. Компьютеры, объединенные в сеть, образуют пространство, в котором живут существа, которые могут обмениваться информацией друг с другом. Глобальная сеть представляет собой информационное пространство (Inforaum), в которой живут существа, которые могут обмениваться информацией друг с другом и с существами, которые живут в их Inwelt. Информационная материя бывает живая и мертвая. Живая представлена существами, а мертвая – объектами.

Если посмотреть на программирование с точки зрения ВП, то можно пересмотреть определение программирования, данное нами в 0-й главе (программирование – это написание программ). Теперь задача программиста – не давать указания процессору, что ему делать, а описывать явления, происходящие в

Inforaum.

Видно, что концепция везенспрограммирования решает те 3 проблемы, которые были рассмотрены выше.

19.7. Что мы с вами еще не сделали

Мы не рассмотрели еще один недостаток современных языков программирования – ограниченность наследования. Наследование позволяет создавать новые классы на основе уже существующих. Но для этого предлагается лишь один способ: дописать что-то или изменить что-то (т.е. переопределить метод). Исходя из этого, мне кажется, что наследование следовало бы назвать обрастанием.

Кроме того, одиночного наследования не всегда хватает, а с реализацией множественного наследования могут возникнуть проблемы. А хотелось бы получить универсальный механизм, который не ограничивался бы добавлением или изменением каких-то частей класса, но позволял бы перестраивать класс как угодно, причем чтобы большую часть этой работы делал бы сам компьютер, а не программист. Пока такого механизма нет. Но зато есть задача, которая требует решения. Так что вперед!

387

Напутствие

Учебник подходит к концу. На мой взгляд, у вас может возникнуть два вопроса: Чего мы достигли?

Что делать дальше?

Первый вопрос значительно проще второго. Мы с вами:

Изучили высокоуровневые императивные языки программирования: рассмотрели общие принципы, которые положены в основу процедурных и ОО-языков и как эти принципы реализованы в ТР и Delphi, а также вкратце обсудили некоторые другие языки.

Рассмотрели многие важные алгоритмы и основные структуры данных и разобрались, зачем они вообще нужны.

Изучили некоторые принципы работы ОС и разобрали проблемы, которые возникают при взаимодействии ОС и концепций ООП.

Разработали концепцию везенспрограммирования (ВП), которая позволяет решить многие из проблем, с которыми столкнулась современные ОО-языки.

Второй вопрос гораздо важнее. На мой взгляд, дальше можно:

1.Изучить функциональные (напр. LISP) и логические (напр. Prolog) языки. Это не отнимет у вас много времени, т.к. часть понятий в этих языках будет аналогична тем, которые вам уже известны, и вам не надо заново изучать алгоритмы (не говоря о том, что ваш опыт программирования уже внушителен).

2.Изучить низкоуровневое программирование. Сложность ассемблера – чисто техническая, концептуально он очень прост. Поэтому начинать изучение с ассемблера не очень эффективно. Но теперь, когда вы уже хорошо понимаете программирование, разобраться в том, как функционирует процессор, будет очень полезно. Кроме того, интересно знать, как реализуется рекурсия на низком уровне, насколько быстрее можно выполнить умножение, чем сложение и т.д. Эти вопросы удобнее всего рассматривать именно в курсе ассемблера.

3.Полезно разобраться в устройстве современных ОС и компиляторов.

4.Искусственный интеллект (ИИ). Несмотря на многочисленные высказывания о том, что вот-вот будет построен машинный интеллект, который будет соперничать с человеческим, все это на сегодняшний момент – лишь разговоры. Но имитация (довольно грубая) некоторых аспектов умственной деятельности проводится уже давно. Хотя это и не ИИ, но все же эти алгоритмы позволяют решать достаточно сложные задачи. Поэтому я думаю, что разобраться в современных тенденциях в исследовании ИИ и отделить зерна от плевел будет для вас интересной задачей.

На последние вопросы я ответил – теперь можно прощаться. Надеюсь, что этот учебник вам понравился и еще больше – что кто-то из вас напишет другой, который будет лучше этого. Удачи вам!

388

Решения и ответы

Глава 1

1. Такого числа нет.

3.10942 = 100 0100 0110, 10242 = 100 0000 0000

4.BAD16 = 298910 , FEED16 =6526110

5.s = [log10 n]+1

6.s = [logk n]+1, k - основание системы счисления.

7.Пусть x = 0.123456789101112... Предположим, что x - периодическая дробь. Тогда

оно представимо в виде:

x = y + 0.(T ) , где

y

- конечная десятичная дробь, а

Т = t1t2...tn - период ( ti -

цифры). Берем первое из чисел натурального ряда,

находящихся в периодической части числа

x

такое, что его количество цифр

будет кратно периоду (ясно, что такое число существует). Пусть это число = s . Вид его будет таким: s = ti ...tnt1...tn ...t1...ti −1 . Но в таком случае следующее число

должно совпасть с числом s , т.к. у него столько же цифр, сколько и у числа s (если s состоит из одних девяток, тогда период состоит из девяток, что неверно). Но этого не может быть, т.к. следующее число на 1 больше, чем s . Получили противоречие.

8.

Согласно ПИ ak −1 = 1, k =

1, n

. Подставляя в выкладки, приведенные в

 

 

«доказательстве» значение

n = 1 , получим, что a(1+1)−1 =

a1−1 a1−1

, т.е. в знаменателе

 

a(1−1)−1

 

 

 

 

 

 

 

 

 

 

стоит a−1 , а в ПИ не говорится о том, что a−1 = 1, следовательно, ПИ применять

 

нельзя.

 

 

 

 

 

 

 

 

 

 

 

9.

Ошибка в БИ. Сумма, стоящая в левой части, будет равна

 

1

 

при n = 2 . При n = 1

1 2

 

 

 

 

 

 

 

 

 

 

 

она равна 0.

 

 

 

 

 

 

 

 

 

 

 

10.

 

 

 

 

 

 

 

 

 

 

 

 

БИ: при n = 1 неравенство очевидно

 

 

 

 

 

 

 

ПИ:

предположим,

что

для

любого

k n

выполняется

(1− a1 )(1− a2 )...(1− ak ) ≥ 1− (a1 + a2 + ... + ak )

 

 

 

 

 

 

 

ШИ: докажем, что неравенство выполняется и для k = n +1:

 

 

 

 

 

(1 − a1 )(1 − a2 )...(1 − an ) (1 − an+1 ) [cогласно ПИ и тому, что ai

< 1] ≥ (1 − (a1 + a2 + ... + an ))(1 − an+1 ) =

= 1

− (a

+ a

 

+ ... + a

 

) + a

 

(a +

... + a

) ≥ т.к. a

 

> 0,i =

 

 

≥ 1 − (a + a

 

+ ... + a

 

 

 

 

n+1

n+1

 

1, n

 

n+1

)

 

1

 

 

 

2

 

 

 

 

 

 

1

 

 

 

n

 

 

 

i

 

 

 

 

 

 

 

 

 

 

1

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14.От противного: log

15 =

3

n

= 15 3m = 3n5n

. Если n ≠ 0 , то правая часть делится

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

на 5, а левая нет. Значит n = 0 , а этого не может быть. Получили противоречие.

15.Пусть qk - количество k -ичных цифр в записи числа sk . Так как fk

= 0.(sk ) , то

 

(10

k

)qk

f

k

= s .(s

) , где 10

k

- число k , записанное в k -ичной ССч. Полученное

 

 

 

 

 

 

k

 

k

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

выражение можно преобразовать так:

 

(10

k

)qk f

k

= s

+ f

k

. Осталось лишь перевести

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

 

 

 

 

 

 

 

 

 

 

 

все числа из k -ичной ССч в 10-ю: k qk f

 

= s + f , или f

=

 

 

s10

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

 

 

10

 

10

 

 

 

10

 

k qk −1

 

 

 

18.Докажем соотношение. Шаг индукции:

389

y(n+1) = ( y(n ) )′ = ((−1)n n! x n−1 ln x + (−1)n−1 cn xn−1 )= (−1)n+1(n + 1)! xn−2 ln x + (−1)n ((n + 1)cn + n!)xn−2

Если принять, что cn+1 = (n +1)cn + n!, то соотношение доказано. Теперь найдем вид cn .

Давайте вместо cn

подставим ее выражение через cn−1 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cn+1 = (n +1) ((n −1)!+ cn−1n) + n! = n!+ (n −1)!(n +1) + cn−1n(n +1) .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Теперь пришло время догадки. Видно, что n! =

(n +1)!

, (n −1)!(n +1) =

(n +1)!

. Если

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n +1

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

внимательно приглядеться, то сразу приходит в голову мысль: cn

= n! 1+

1

+

 

1

+ ... +

1

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

3

 

n

Осталось лишь доказать это соотношение по индукции.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

19. а) ϕ = lim

fn+1

= lim

 

fn + fn−1

= 1+ lim

 

 

 

fn−1

 

 

= 1+

1

. Значит ϕ 2 ϕ −1 = 0 . Отсюда, учитывая,

 

 

 

 

 

 

 

 

 

 

 

fn

 

 

 

 

fn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n→∞

 

fn

 

 

 

 

n→∞

 

 

 

 

 

 

 

 

 

 

n→∞

 

 

 

 

 

 

 

 

 

 

ϕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

что ϕ > 0 , получим: ϕ =

1+ 5

 

 

- «золотое сечение»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

б) Мы знаем: ϕ = 1+

1

. Оценим разность

fn+1

ϕ .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ϕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fn+1

 

ϕ =

1

 

 

( fn+1

 

ϕ fn ) =

1

 

 

 

fn+1 − (1+

1

 

 

) fn

 

=

1

fn−1

1

 

fn

=

−1

( fn ϕ fn−1 ) = [...] =

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fn

 

 

 

 

 

 

 

 

fn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fn

 

 

 

 

 

 

 

 

 

 

ϕ

 

 

 

 

 

 

 

 

 

 

fn

 

 

 

 

ϕ

 

 

 

 

 

ϕ fn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(−1)2

( fn−1 ϕ fn−2 ) = [...] =

(−1)n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(−1)n (1− ϕ)

 

 

 

 

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

( f1 ϕ f0 ) =

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ϕ 2 f

n

 

 

ϕ n f

 

 

 

 

 

 

ϕ n f

n

 

 

ϕ n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fn+1

ϕ

=

| An |

 

 

 

[ n N | A |< 2]

2

 

 

 

→ 0 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ϕ n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

ϕ n

 

 

 

 

 

 

n →∞

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

20. Мы знаем (задача 19), что ϕ = 1+

1

 

. Сразу хочется сделать так:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ϕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ϕ = 1+

 

 

1

 

 

 

 

= 1

+

 

 

 

 

1

 

 

 

 

 

 

 

= ... = 1+

 

 

 

1

 

 

 

 

 

 

 

 

. Идея верна, однако надо доказать сходимость

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1+

1

 

1+

 

1

 

 

 

 

 

1+

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ϕ

 

 

 

 

 

 

 

 

 

 

1+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1+ ...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ϕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

правой части равенства к золотому сечению.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Давайте введем такую последовательность функций: g

= 1+

1

,

g

 

 

= 1+

1

,

n > 1 .

 

 

 

 

n+1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

x

 

 

 

gn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пусть g

 

 

 

=

An

 

- несократимая дробь, где A ,

 

 

B

- многочлены от переменной x . Тогда

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Bn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

An

= g

 

 

= 1+

 

 

1

 

 

= 1+

Bn−1

=

 

An−1 + Bn−1

, т.е. B = A

 

 

, и A = A

 

 

+ A

. Получились какие-то

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

−1

−1

 

Bn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

gn−1

 

 

 

 

 

 

An−1

An−1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

n

 

 

 

 

 

 

n

n

 

 

 

n−2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

многочлены Фибоначчи. Из g

 

=

1+ x

, g

 

 

=

1+ 2x

можно предположить:

g

 

 

 

=

 

 

fn x + fn−1

,

 

 

2

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

x +1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fn−1x + fn−2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

что легко доказывается по индукции. Пусть ϕ - золотое сечение.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

lim g

 

= lim

 

 

 

fn x + fn−1

 

= lim

( fn / fn−1 )x +1

=

 

 

ϕ x +1

= ϕ

x + (1/ϕ)

= ϕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n→∞

 

 

 

 

n→∞ f

 

 

 

 

x

+ f

 

 

 

 

 

 

 

 

n→∞ x +

( f

 

 

/ f

 

 

 

 

 

)

 

 

 

 

x + (1/ϕ)

 

 

 

 

x + (1/ϕ)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n−1

n−2

 

 

 

n−2

n−1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

21. Рассмотрим S p+1 (n +1) = 1p +1 + 2p +1 + ... + (n +1) p +1 = 1p+1 + (1+1) p+1 + (2 +1) p+1 + ... + (n +1) p+1 =.

390

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p +1

p+1

 

 

 

 

p+1

 

 

p+1

 

 

= 1p+1 + Cpi +11i 1p+1−i

+ Cpi +1 2i 1p+1−i

+ ... + Cpi +1ni

1p +1−i = 1+ Cpi +1 (1i

+ 2i + ... + ni ) =

i=0

i =0

 

 

 

 

i =0

 

 

i =0

 

 

p +1

 

 

 

 

 

 

p−1

 

 

 

 

 

 

= 1+ Cpi +1Si (n) = 1+ S p +1 (n) + ( p +1)S p (n) + Cpi +1Si (n) .

 

 

 

 

i=0

 

 

 

 

 

 

i=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p−1

 

 

 

 

Теперь легко видеть, что (n +1) p+1 = 1+ ( p +1)S p (n) + Cpi +1Si (n) .

 

 

 

 

 

 

 

 

 

 

 

 

i=0

 

 

 

 

 

 

 

 

 

 

 

 

p −1

 

 

 

 

 

 

Следовательно: S p (n) =

1

(n +1) p+1 −1− Cpi +1Si (n) .

 

 

 

 

 

 

 

p +1

 

 

 

 

i=0

 

 

 

 

 

 

Рекуррентная формула выведена. Надо еще знать S0 (n) :

S0 (n) = 10 + 20 + ... + n0

= n .

 

 

 

 

 

 

 

 

Глава 2

 

 

 

 

 

5. Объем бочки: V

 

= π (R − с)2 (H − 2с) , где с – толщина.

 

 

бочки

 

 

 

 

 

 

 

 

 

 

 

 

 

Масса пустой бочки: М

бочки

= V ρ

жел

= (π R2 H V

) ρ

жел

 

 

 

 

 

 

 

 

 

 

бочки

 

 

 

V - объем железа, затраченного на изготовление бочки.

 

 

6.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

-3 -2

-1 0

1

2

3

 

X

 

 

 

 

 

 

 

 

 

-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-3

 

 

 

 

 

 

 

7. Предположим, что T

– период, тогда {x + T} = {x} = x − [x]

 

 

Но при этом {x + T} = x + T − [x + T ] .

 

 

 

 

 

 

 

 

 

Объединяя результаты, и приводя подобные слагаемые, получим:

 

[x] + T = [x + T ]

(1)

Это равенство должно выполняться при всех х, в частности, для х=0. Значит T = [T ] , а

это выполняется только для целых чисел. А в том, что формула (1) выполняется для целых чисел Т, можно убедиться непосредственно из определения функции целой части. Значит функция y = {x} периодическая, и ее период равен 1.

8.Равенство верно лишь для дробных значений x. Для целых чисел равенство не выполняется.

9.Используя периодичность функции y = {x}, получим:

{x + y} = {{x}+ [x] + {y}+ [ y]} = {{x}+ {y}}

Теперь, учитывая то, что {x} ≤ x при любых положительных числах х, получим, что {{x}+ {y}} ≤ {x}+ {y}, что и доказывает утверждение.

10. [x + y] = x + y −{x + y} ≥ x + y − ({x}+ {y}) = [x] + [ y]

11. Будем доказывать, что из f1 (x + y) ≤ f1 (x) + f1 ( y) следует f 2 (x + y) ≥ f 2 (x) + f 2 ( y) . f (x + y) = f1 (x + y) + f2 (x + y) ≤ f1 (x) + f1 ( y) + f2 (x + y)