Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2014, 13:21   #1
_BYTE
Пользователь
 
Регистрация: 11.12.2013
Сообщений: 56
По умолчанию вопросы про логическое "не" и макросы

во первых уже не раз встречал формулировку !число, что это значит? как можно логически отрицать число? кроме как !1 = 0, !0 = 1? не понимаю

во вторых нашел такую вот красивую рекурсивную формулировку факториала, только почему то у меня выдает ошибку error C3861: factorial: идентификатор не найден

#define factorial(x) !x ? 1 : x * factorial(x - 1)

Последний раз редактировалось _BYTE; 22.05.2014 в 13:25.
_BYTE вне форума Ответить с цитированием
Старый 22.05.2014, 13:41   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

имхо, через define рекурсивную формулу описать нельзя.
Пишите функцию.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.05.2014, 13:43   #3
_BYTE
Пользователь
 
Регистрация: 11.12.2013
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
имхо, через define рекурсивную формулу описать нельзя.
Пишите функцию.
почему? просто особенность языка чтоли? а про "не"? что например значит !x в этой формуле?
_BYTE вне форума Ответить с цитированием
Старый 22.05.2014, 14:06   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

!x - это для сравнения x с нулём/не нулём

это аналог такого программного кода:
Код:
if(x==0) {
   return 1;
}
else {
   return x * factorial(x - 1);
}
так понятней?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.05.2014, 14:21   #5
_BYTE
Пользователь
 
Регистрация: 11.12.2013
Сообщений: 56
По умолчанию

вроде понятнее... только тогда я какую то фигню выходит нарыл -_- факториал нуля то 0 а не 1... вот так наверное будет тогда правильнее, если уж функцией делать

Код:
unsigned long factorial(int x)
{
	return (((x >= 0) ? x : - x) == 0) ? 0 : x * factorial(x - 1);
}
только че то все время 0 выдает

з.ы. люблю я тернарный оператор =)

Последний раз редактировалось _BYTE; 22.05.2014 в 14:26.
_BYTE вне форума Ответить с цитированием
Старый 22.05.2014, 14:32   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) не рекомендую использовать подобный код для нахождения факториала ОТРИЦАТЕЛЬНЫХ чисел.

2) при умножении любого числа на ноль, всегда получается ноль!
Код:
    return (x == 0) ? 1 : x * factorial(x - 1);

Цитата:
факториал нуля то 0 а не 1
где Вы подобную чепуху прочитали?!? Факториал нуля равен единице!


p.s. кстати, Вы, похоже, не понимаете, что такое рекурсия... Рекомендую пошагово пройтись (можно на бумажке с ручкой) и разобраться...

Последний раз редактировалось Serge_Bliznykov; 22.05.2014 в 14:34.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.05.2014, 14:46   #7
_BYTE
Пользователь
 
Регистрация: 11.12.2013
Сообщений: 56
По умолчанию

1. но для того же я и присобачил вот это: ((x >= 0) ? x : - x), т.е. это фактически тоже самое что abs, просто не надо таскать за собой юнит с абсом... но ктати при попытке ввести отрицательное число выдало ошибку почему интересно...

2. ну это то я знаю

3. че реально единице? О_О че то у меня это логически в голове не укладывается... ведь вот именно из пункта 2: 0*0 = 0 же... как тогда факториал 0 = 1? это бред же...

4. да я никогда не понимал рекурсию особо, просто она красивее намного и короче
_BYTE вне форума Ответить с цитированием
Старый 22.05.2014, 15:31   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
3. че реально единице? О_О че то у меня это логически в голове не укладывается... ведь вот именно из пункта 2: 0*0 = 0 же... как тогда факториал 0 = 1? это бред же...
Реально. Учите определение. Факториал - это произведение натуральных чисел от 1 до н. Нуля там нет.
p51x вне форума Ответить с цитированием
Старый 23.05.2014, 07:30   #9
_BYTE
Пользователь
 
Регистрация: 11.12.2013
Сообщений: 56
По умолчанию

ответьте пожалуйста почему у меня это условие не срабатывает??? ((x >= 0) ? x : - x)
_BYTE вне форума Ответить с цитированием
Старый 23.05.2014, 08:55   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

срабатывает. это же ваш любимый тернарный оператор.
если x больше/равен нуля, то результат выражения в скобках будет равен x, если x отрицательное значение, то результат выражения в скобках будет -x (т.е. положительное число),
потом полученный результат сравнивается с нулём.
На значение x (отрицательное) это никак не влияет, именно оно и берётся при умножении.

Вы, вероятно, хотели так написать:
Код:
return x == 0 ? 1 : (x > 0 ? x : - x)  * factorial((x > 0 ? x : - x) - 1);
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глупые вопросы про указатели Qaliti Общие вопросы C/C++ 4 05.01.2014 00:28
Банальные вопросы про Апи Хуки. LXandR Общие вопросы C/C++ 6 25.08.2012 13:31
Вопросы про INTERNET Trash Band Помощь студентам 3 27.12.2011 11:25
Вопросы про компонент HTTPRIO Anatai Компоненты Delphi 0 24.01.2011 13:13
Вопросы новичка про C++ k1r1ch C++ Builder 5 25.11.2009 15:11