Alex, ну вам бы тоже не мешало подучиться, если вы кидаете сслыку на сайт с кривыми машинными переводами вопросов-ответов со stackoverflow. Задавая вопрос здесь, я прежде всего надеялся на интересное обсуждение, но, к сожалению, не сложилось. Всё равно, спасибо за ответ.
Alex, хотелось бы найти более красивое и чистое решение и не плодить дополнительных параметров или функций. Сейчас напишу апдейт в вопрос. К тому же, это вариант решения проблемы, но не ответ на вопрос как отличить рекурсивный вызов от нерекурсивного.
evg_96, Racket – диалект Scheme, которой сам – диалект LISP. С обратной совместимостью все в порядке, он вполне подойдет для выполнения примеров кода SICP.
Да, увидел ошибку в своих рассуждениях: я считал A = B < C = D и C = D < A = B за разные случаи, 12 вместо 6. Но и у вас здесь чисто арифметическая ошибка: в [2,1,1] => A = B < C < D должно быть P = 4! / (2! * 1! * 1!) = 12. Такие образом правильное число вариантов для 4 чисел –75. Можете отредактировать ответ, чтобы я отметил его как решение?
В вашем примере можно рассуждать по правилу умножения: первый символ выбираем из букв (любая буква из N), второй символ выбираем из знаков отношений (любой из трёх), третий символ – снова из букв (их осталось N-1) и так далее. Для трёх букв (и соответственно двух знаков) получаем количество возможных сочетаний 3 * 3 * 2 * 3 * 1= 54, когда их должно быть 13 – проблема метода в том, что он не позволяет узнать количество дублирующихся комбинаций.
Saboteur: Да. Когда все четыре числа равны – это 1 случай; когда все четыре числа не равны друг другу – это еще 4! = 24 случая; когда некоторые три числа равны между собой и не равны четвертому – это еще 8 случаев (4 сочетания по 3 из 4 и 2 варианта (больше-меньше оставшегося числа) для каждого из сочетаний). Оставшиеся случаи – это когда между собой равны некоторые два числа из четырех и не равны оставшимся двум. Число таких возможных пар будет равно количеству сочетаний по 2 из 4 = 6. И для каждой из шести таких пар могут быть следующие варианты: 2 оставшихся числа также равны между собой (и тогда есть два варианта: первая пара равных чисел больше или меньше второй пары равных чисел) или два оставшихся числа не равны друг другу (и тогда получается, что у нас есть три неравных друг другу сущности, для которых есть 3!=6 вариантов расстановок). Получается, что для каждой из 6 пар есть 8 вариантов отношений с оставшимися 2 числами – это 48 вариантов всего. И общее количество возможных вариантов: 1 + 24 + 8 + 48 = 81. А как вы получили 109?
vibe-vibe: Да это собственно не правило, а определение составного числа: любое число имеющее делители отличные от 1 и самого числа называется составными, эти делители всегда в конечном итоге представляют собой простые числа – "строительные кирпичи" всех остальных чисел.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
multiscripter, спасибо.