Подскажите новичку

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

Подскажите новичку

Vladimir Novikov

Добрый день, уважаемые участники группы.

Подскажите, человеку, осваивающему, ООП и SmallTalk, решить задачку, описанную ниже

Как я понимаю здесь рекурсия. Как будет выглядеть метод для решения вышеуказанной задачи.


С уважением, Владимир Новиков 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Подскажите новичку

Dmitry Matveev
Сначала надо переписать итеративно, задача прекрасно "раскручивается" задом наперёд.

Потом всё станет ясно.

Дмитрий

16 марта 2015 г., 12:34 пользователь Vladimir Novikov <[hidden email]> написал:

Добрый день, уважаемые участники группы.

Подскажите, человеку, осваивающему, ООП и SmallTalk, решить задачку, описанную ниже

Как я понимаю здесь рекурсия. Как будет выглядеть метод для решения вышеуказанной задачи.


С уважением, Владимир Новиков 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Подскажите новичку

Dennis Schetinin
Через TDD :)

Не помню, как функция назывется, поэтому просто func.

Создаем класс FuncTest:

TestCase subclass: #FuncTests
instanceVariableNames: ''
classVariableNames: ''
category: 'Temp'

В нем метод testOne:

FuncTests >> testOne
self assert: 1 func = 1 sqrt.

Запускаем, получаем DNU, из отладчика создаем метод func в Integer:

Integer >> func
  ^ 1

Можно ничего не писать (вернет self, который и есть 1), но лучше явно.


FuncTests >> testTwo
self assert: 2 func = (1 + 1 sqrt) sqrt.


Реализация:

Integer >> func
^ self = 1
ifTrue: [ 1. ]
ifFalse: [ (1 + 1 sqrt) sqrt. ].


Тест работает. Рефакторим. 1 sqrt — дублирует 1 func:

Integer >> func
^ self = 1
ifTrue: [ 1. ]
ifFalse: [ (1 + 1 func) sqrt. ].

Пока дублирования больше не наблюдается.

FuncTests >> testThree
self assert: 3 func = (1 + (1 + 1 sqrt) sqrt) sqrt.


Реализация… Лень добавлять еще один if, поэтому догадываемся, что можно использовать предыдущее значение:

Integer >> func
^ self = 1
ifTrue: [ 1. ]
ifFalse: [ (1 + (self - 1) func) sqrt. ].


Вроде, и все…




--

Best regards,


Dennis Schetinin


16 марта 2015 г., 15:46 пользователь Dmitry Matveev <[hidden email]> написал:
Сначала надо переписать итеративно, задача прекрасно "раскручивается" задом наперёд.

Потом всё станет ясно.

Дмитрий

16 марта 2015 г., 12:34 пользователь Vladimir Novikov <[hidden email]> написал:

Добрый день, уважаемые участники группы.

Подскажите, человеку, осваивающему, ООП и SmallTalk, решить задачку, описанную ниже

Как я понимаю здесь рекурсия. Как будет выглядеть метод для решения вышеуказанной задачи.


С уважением, Владимир Новиков 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Подскажите новичку

Vladimir Novikov
In reply to this post by Vladimir Novikov
Спасибо большое, за доходчивое объяснение. 

Будем двигаться дальше!

понедельник, 16 марта 2015 г., 14:37:26 UTC+5 пользователь Vladimir Novikov написал:

Добрый день, уважаемые участники группы.

Подскажите, человеку, осваивающему, ООП и SmallTalk, решить задачку, описанную ниже

<a href="https://lh5.googleusercontent.com/-PN0aLi9YIWo/VQaisLiCjDI/AAAAAAAAAA8/AcNjifbwLJY/s1600/%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F.jpg" style="margin-left:1em;margin-right:1em" target="_blank" rel="nofollow" onmousedown="this.href='https://lh5.googleusercontent.com/-PN0aLi9YIWo/VQaisLiCjDI/AAAAAAAAAA8/AcNjifbwLJY/s1600/%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F.jpg';return true;" onclick="this.href='https://lh5.googleusercontent.com/-PN0aLi9YIWo/VQaisLiCjDI/AAAAAAAAAA8/AcNjifbwLJY/s1600/%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D1%8F.jpg';return true;">

Как я понимаю здесь рекурсия. Как будет выглядеть метод для решения вышеуказанной задачи.


С уважением, Владимир Новиков 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Подскажите новичку

Nikolay Kleptsov
Рекурсивные функции возможно реализовать без рекурсии. Конечно такая реализация не настолько наглядна как рекурсия, и все же.
Добавляем метод
Number>>rSqr
|a|
a := 1.
2 to: self do: [:index|
    a := (1 + a) sqrt].
^ a.

17 марта 2015 г., 10:14 пользователь Vladimir Novikov <[hidden email]> написал:
Спасибо большое, за доходчивое объяснение. 

Будем двигаться дальше!

понедельник, 16 марта 2015 г., 14:37:26 UTC+5 пользователь Vladimir Novikov написал:

Добрый день, уважаемые участники группы.

Подскажите, человеку, осваивающему, ООП и SmallTalk, решить задачку, описанную ниже

Как я понимаю здесь рекурсия. Как будет выглядеть метод для решения вышеуказанной задачи.


С уважением, Владимир Новиков 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Подскажите новичку

Nikolay Kleptsov
проверяем, для этого в workspace вводим
3 rSqr.
выделяем выделенный текст и исполняем (ctrl + p) или правая кнопка мыши -> контекстное меню -> printIt
1.5537739740300374

17 марта 2015 г., 11:38 пользователь Nikolay Kleptsov <[hidden email]> написал:
Рекурсивные функции возможно реализовать без рекурсии. Конечно такая реализация не настолько наглядна как рекурсия, и все же.
Добавляем метод
Number>>rSqr
|a|
a := 1.
2 to: self do: [:index|
    a := (1 + a) sqrt].
^ a.

17 марта 2015 г., 10:14 пользователь Vladimir Novikov <[hidden email]> написал:

Спасибо большое, за доходчивое объяснение. 

Будем двигаться дальше!

понедельник, 16 марта 2015 г., 14:37:26 UTC+5 пользователь Vladimir Novikov написал:

Добрый день, уважаемые участники группы.

Подскажите, человеку, осваивающему, ООП и SmallTalk, решить задачку, описанную ниже

Как я понимаю здесь рекурсия. Как будет выглядеть метод для решения вышеуказанной задачи.


С уважением, Владимир Новиков 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Подскажите новичку

Dennis Schetinin
Раз пошла такая пьянка:

(2 to: self) inject: 1 into: [ :previous :unused | (1 + previous) sqrt. ].




;)




--

Best regards,


Dennis Schetinin


17 марта 2015 г., 9:43 пользователь Nikolay Kleptsov <[hidden email]> написал:
проверяем, для этого в workspace вводим
3 rSqr.
выделяем выделенный текст и исполняем (ctrl + p) или правая кнопка мыши -> контекстное меню -> printIt
1.5537739740300374

17 марта 2015 г., 11:38 пользователь Nikolay Kleptsov <[hidden email]> написал:

Рекурсивные функции возможно реализовать без рекурсии. Конечно такая реализация не настолько наглядна как рекурсия, и все же.
Добавляем метод
Number>>rSqr
|a|
a := 1.
2 to: self do: [:index|
    a := (1 + a) sqrt].
^ a.

17 марта 2015 г., 10:14 пользователь Vladimir Novikov <[hidden email]> написал:

Спасибо большое, за доходчивое объяснение. 

Будем двигаться дальше!

понедельник, 16 марта 2015 г., 14:37:26 UTC+5 пользователь Vladimir Novikov написал:

Добрый день, уважаемые участники группы.

Подскажите, человеку, осваивающему, ООП и SmallTalk, решить задачку, описанную ниже

Как я понимаю здесь рекурсия. Как будет выглядеть метод для решения вышеуказанной задачи.


С уважением, Владимир Новиков 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Подскажите новичку

Dennis Schetinin
In reply to this post by Nikolay Kleptsov
А чтобы ненужных переменных не было:

| result |
result := 1.
self - 1 timesRepeat: [ result := (1 + result) sqrt. ].
^ result.




--

Best regards,


Dennis Schetinin


17 марта 2015 г., 9:43 пользователь Nikolay Kleptsov <[hidden email]> написал:
проверяем, для этого в workspace вводим
3 rSqr.
выделяем выделенный текст и исполняем (ctrl + p) или правая кнопка мыши -> контекстное меню -> printIt
1.5537739740300374

17 марта 2015 г., 11:38 пользователь Nikolay Kleptsov <[hidden email]> написал:

Рекурсивные функции возможно реализовать без рекурсии. Конечно такая реализация не настолько наглядна как рекурсия, и все же.
Добавляем метод
Number>>rSqr
|a|
a := 1.
2 to: self do: [:index|
    a := (1 + a) sqrt].
^ a.

17 марта 2015 г., 10:14 пользователь Vladimir Novikov <[hidden email]> написал:

Спасибо большое, за доходчивое объяснение. 

Будем двигаться дальше!

понедельник, 16 марта 2015 г., 14:37:26 UTC+5 пользователь Vladimir Novikov написал:

Добрый день, уважаемые участники группы.

Подскажите, человеку, осваивающему, ООП и SmallTalk, решить задачку, описанную ниже

Как я понимаю здесь рекурсия. Как будет выглядеть метод для решения вышеуказанной задачи.


С уважением, Владимир Новиков 

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.