Практическое применение “Бананов, Линз, Конвертов и Колючей проволоки”?

Если Вы делаете поиск делением пополам, чтобы попытаться найти "правильный" квадратный корень, можно довольно легко обнаружить, если значение, которое Вы имеете, достаточно близко для сообщения:

(n+1)^2 = n^2 + 2n + 1
(n-1)^2 = n^2 - 2n + 1

Так вычислявший n^2, опции:

  • n^2 = target: сделанный, возвратитесь верный
  • n^2 + 2n + 1 > target > n^2: Вы близки, но это не прекрасно: возвратите false
  • n^2 - 2n + 1 < target < n^2: так же
  • target < n^2 - 2n + 1: поиск делением пополам на более низком n
  • target > n^2 + 2n + 1: поиск делением пополам на более высоком n

(Извините, это использует n в качестве Вашего текущего предположения, и target для параметра. Принесите извинения за беспорядок!)

я не знаю, будет ли это быстрее или нет, но это стоит попытки.

РЕДАКТИРОВАНИЕ: поиск делением пополам не должен брать в целом диапазоне целых чисел, ни один (2^x)^2 = 2^(2x), поэтому как только Вы нашли, что главный набор укусил в Вашей цели (который может быть сделан с приемом битового жонглирования; я забываю точно, как) можно быстро получить диапазон потенциальных ответов. Следите за Вами, наивный поиск делением пополам все еще только собирается взять до 31 или 32 повторения.

12
задан Jeremy Powell 27 July 2009 в 19:03
поделиться

2 ответа

This paper is one in a long series of related theoretical explorations. The research area is what the functional programmers call generic programming (which confusingly is different from what C++ programmers call generic programming). The idea is that you write your functions in such a way that when you define a new data type, you automatically get new code to go with it. A classic problem people would like to solve this way is to write an image of the data to disk and later read back isomorphic data from the disk image.

If you want to get a feel for practical applications of these ideas, I recommend Ralf Hinze's excellent paper Generics for the Masses, which shows how you can try out all these wacky ideas in plain old Haskell. For example, I have used these techniques to implement capture-avoiding substitution for very complicated intermediate languages inside compilers.

Ralf has written a number of good papers on generic programming, as has Jeremy Gibbons. Their stuff is not quite as far out as bananas, lenses, and so on...

15
ответ дан 2 December 2019 в 19:55
поделиться

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

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

Это похоже на монады. С монадой дело не в том, как ее написать. Главное в них то, что существует множество теорем о монадах, которые можно применить, как только вы сведете проблему к монаде. Здесь действует тот же принцип.

2
ответ дан 2 December 2019 в 19:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: