2016-03-07 1 views
1

Так что в моем тексте книги есть этот пример рекурсивной функции с использованием F #F #: integer (%) integer - Рассчитано Как?

let rec gcd = function 
| (0,n) -> n 
| (m,n) -> gcd(n % m,m);; 

с этой функцией мой текст книги дает пример, выполнив:

gcd(36,116);; 

и с т = 36 и не 0, то это конечно идет на второй пункт, как это:

gcd(116 % 36,36) 
gcd(8,36) 
gcd(36 % 8,8) 
gcd(4,8) 
gcd(8 % 4,4) 
gcd(0,4) 
and now hits the first clause stating this entire thing is = 4. 

Что я не получаю это (%) знак процента/оператора или то, что называется I n это соединение. для экземпляра я не понимаю, как

116 % 36 = 8 

я это так много раз оказался в моей голове, и я не могу понять, как это может превратиться в 8?

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

+0

https://en.wikipedia.org/wiki/Modulo_operation –

ответ

6

% является сомнительной версия по модулю, что остаток от целочисленного деления.

В положительном, вы можете думать о % в качестве остатка. См. Например, Wikipedia on Euclidean Divison. Рассмотрим 9 % 4: 4 вписывается в 9 дважды. Но два раза четыре - всего восемь. Таким образом, есть остаток от одного.

Если есть отрицательные операнды, % эффективно игнорирует знаки для вычисления остатка, а затем использует знак дивиденда в качестве знака результата. Это соответствует остатку целочисленного деления, которое округляется до нуля, то есть -2/3 = 0.

Это математически необычное определение деления и остатка, которое имеет некоторые плохие свойства. Обычно при расчете по модулю n добавление или вычитание n на входе не оказывает никакого влияния. Не так для этого оператора: 2 % 3 не равно (2 - 3) % 3.

Я обычно имею следующий определенный получить полезные остатки, когда есть отрицательные операнды:

/// Euclidean remainder, the proper modulo operation 
let inline (%!) a b = (a % b + b) % b 

До сих пор этот оператор был действителен для всех случаев, с которыми я столкнулся, где был необходим по модулю, в то время как сырой % повторно не было. Например:

  • При заполнении строк и столбцов из одного индекса, можно рассчитать rowNumber = index/nCols и colNumber = index % nCols. Но если index и colNumber могут быть отрицательными, это сопоставление становится недействительным, тогда как евклидова деление и остаток остаются в силе.

  • Если вы хотите нормализовать угол (0, 2pi), angle %! (2. * System.Math.PI) выполняет эту работу, а «нормальный» % может дать вам головную боль.

+0

В порядке я получаю это сейчас !!! так как 36 могут идти в 116 3 раза, что добавляет 108, тогда остаток равен 8! Thx за всю дополнительную информацию о бонусе! – Nulle

+1

Ваши комментарии не совсем правы в отношении поведения отрицательных аргументов - только знак дивиденда имеет значение, а не знак делителя. – kvb

+0

@kvb Спасибо за хедз-ап! Я исправил это. Прошло слишком много времени, так как я использовал необработанный оператор с отрицательными входами. Но это имеет смысл: по крайней мере, это согласуется с оператором '/' по целым числам со знаком. (Хотя я не знаю случая, когда это оказалось полезным.) – Vandroiy

1

Поскольку

116/36 = 3 
116 - (3*36) = 8 
+0

хорошо в первую очередь 116/36 нет 3 3.22222222 ... 3.222222 ... * 36 = 116. 116-116 = 0 – Nulle

+0

- это целочисленный расчет. –

1

В принципе, оператор%, известный как modulo operator будет делить число на друга и дают остаток, если он не может разделить больше. Как правило, первый раз, когда вы будете использовать его, чтобы понять это было бы, если вы хотите, чтобы увидеть, является ли число четным или нечетным делать что-то подобное в F #

let firstUsageModulo = 55 %2 =0 // false because leaves 1 not 0 

Когда он уходит 8 в первый раз означает, что он разделил вас на 116 с 36, а максимальное число - 8.

1

Просто, чтобы помочь вам в будущем с подобными проблемами: в Иде, такие как Xamarin студия и Visual Studio, при наведении курсора мыши на оператор, такие как% вы должны получить подсказку, таким образом:

Module operator tool tip

Даже если вы не понимаете подсказку прямо, это даст вам что-то для google.