Некоторые соображения о массовом сознании
Запись от Catstail размещена 30.06.2024 в 18:59
Показов 5530
Комментарии 52
Метки нейросеть
|
Нейросеть - это грубая модель человеческого мозга... Читатели несомненно встречали эту фразу многократно. Наблюдая современных студентов (и, к сожалению, не только студентов) я вынужден констатировать обратное: это мозг - модель нейросети, а не наоборот. Нейросеть прекрасно "запоминает", но практически не способна к критическому анализу. Так и мозг некоторых "будущих программистов". Вот пара развёрнутых примеров. Факториал Как хорошо известно всем n! - это произведение всех целых чисел от 1 до n. Это очень важная целочисленная функция, которая находит широчайшее применение в самых разных разделах математики. Как вычислять факториал? Исходя из данного выше определения, у разумного человека должен "родиться" следующий код:
Я не вижу другого объяснения кроме самого очевидного: когда студентам "объясняют рекурсию", то в качестве одного из примеров (если не самого первого!) приводят расположенный выше код. И что же? Нейросеть обучается - в ней прочно "прожигается" пара "факториал - рекурсия". Всё. Акт обучения завершён. Теперь обучаемый будет программировать по принципу Читатели могут "пошерстить" разделы Форума (посвященные разным языкам) и убедиться, что "обучение работает". Чтобы не заканчивать раздел негативом, приведу рациональный совет. Если вам, читатель, нужно интенсивно использовать факториал (скажем, для аргументов от нуля до 20), то самое разумное решение будет таким:
i++ vs ++i Не так давно я стал замечать, что появились нонкорформисты, которые стали оператор цикла записывать так:
Действительно, накладные расходы на префиксную форму в вот таком операторе:
В языках с "сишным" синтаксисом не зря придуманы префиксная и постфиксная формы автоувеличения. Иногда (по смыслу) нужна префиксная, иногда постфиксная. А для того, чтобы выбрать, нужен акт размышления. Но Давайте рассмотрим следующий сишный код:
ассемблерный код:
Эти два примера наглядно показывают нейросетевой характер человеческого мышления... | ||||||||||||||||||||||||||||||||||||||||
Метки нейросеть
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 52
Комментарии
-
Если чат gpt попросить привести в пример оптимальный код вычисления факториала он выдаст следующее:
Подход итеративный без рекурсии.C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#include <stdio.h> unsigned long long factorial(int n) { if (n < 0) { return 0; // Факториал отрицательного числа не определён } if (n == 0) { return 1; // Факториал 0 равен 1 } unsigned long long result = 1; while (n > 1) { result *= n; n--; } return result; } int main() { int number; printf("Введите число: "); scanf("%d", &number); unsigned long long result = factorial(number); if(result == 0 && number < 0) { printf("Факториал отрицательного числа не существует.\n"); } else { printf("Факториал числа %d равен %llu\n", number, result); } return 0; }
Но мысль уловил. У меня есть другой пример. В прошлом году помогал племяннице с физикой. В моё время g было принято считать равным 9,8 м/с². В современных учебниках 10. Хотя его значение варьируется от 9,78 м/с² на экваторе до 9,82 м/с² на полюсах. В головы молодых людей гадят со школы. Поэтому неудивительно, что факториал они вычисляют рекурсией, как научили - так и умеют.
Запись от Fedor92 размещена 30.06.2024 в 21:45
-
Ну с постфиксной/префиксной икрементой там все не так однозначно. Особенно с учетом что советы эти для С++, где абсолютно все, включая итераторы имеет эти операторы перегруженным. Т.е. вот это гораздо сложнее действительно выливается в сохранение на стеке оператора копии и потом возврата оной копии. Поэтому может быть и быстрее. Может естественно не обязательно будет везде, но где то будет. Соответсвенно там где по контексту не важно какая именно форма используется, лучше все таки использовать префиксную, чтобы не копать под капотом каждой либы что именно они понаперегружали и как. Эт как в русском языке раньше мягкий знак был по дефолту, а потом заменили твердым по дефолту.
P.S. С итераторами контейнеров STL префиксная форма будет действительно быстрее, потому что каждая копия итератора регистрирует/убирает себя в списке итераторов контейнера в конструторе/деструкторе, в том числе при копи/муве. а соответсвенно у постфиксного будет оверхед именно по этой операции для копии и не факт что оптимизатор сможет это убрать даже если возвращенное значение игнорируется. Побочныые эффекты то присутсвуют, а значит убирать копию, как в случае с интом, он не имеет права.Запись от Fulcrum_013 размещена 30.06.2024 в 22:59
-
Ну в одном из американских Штатов как то поставили в парламенте вопрос о том чтобы на территории Штата принять число Пи равное 3. И все к этому и шло. Но влез какой то прохфессор богомерзской математики,
Сообщение от Fedor92
который прям на заседании очень недемократично, при помощи всяких синусов-косинусов и прочей чернокнижнической ереси, запугал всех депутатов что в таком сучае на всей территории Штата технический 3,1415здец поднимется в полный рост немедленно. Ну они недемократично законопроект и провалили. Россия в этом плане страна победившей демократии.Запись от Fulcrum_013 размещена 01.07.2024 в 11:26
-
Запись от XLAT размещена 01.07.2024 в 11:58
-
Запись от sporta1982 размещена 01.07.2024 в 12:08
-
Запись от Fedor92 размещена 01.07.2024 в 15:44
-
Ну например так:
C 1 2 3 4 5 6
int y = 1; int t = 2; int w = 3; int r = 4; int x = y + t * (++w) + r; int x2 = y + t * (w++) + r;
Как видно здесь одинаковое количество строчек.Assembler 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
mov dword ptr ss:[rbp+4],1 // y mov dword ptr ss:[rbp+24],2 // t mov dword ptr ss:[rbp+44],3 // w mov dword ptr ss:[rbp+64],4 // r сначала вычислим x mov eax,dword ptr ss:[rbp+44] // eax = w inc eax // inc eax , (inc w) mov dword ptr ss:[rbp+44],eax // inc w mov eax,dword ptr ss:[rbp+24] // t imul eax,dword ptr ss:[rbp+44] // w*t mov ecx,dword ptr ss:[rbp+4] // y add ecx,eax // y+t*(++w) mov eax,ecx add eax,dword ptr ss:[rbp+64] // y+t*(++w)+r mov dword ptr ss:[rbp+84],eax // x=y+t*(++w)+r теперь вычислим x2 mov eax,dword ptr ss:[rbp+24] // t imul eax,dword ptr ss:[rbp+44] // w mov ecx,dword ptr ss:[rbp+4] // y add ecx,eax // y+t*w mov eax,ecx add eax,dword ptr ss:[rbp+64] // y+t*w+r mov dword ptr ss:[rbp+A4],eax // x2=y+t*(w++)+r mov eax,dword ptr ss:[rbp+44] // eax = w inc eax // w++ mov dword ptr ss:[rbp+44],eax // w++
Запись от sporta1982 размещена 01.07.2024 в 16:02
-
Запись от Catstail размещена 01.07.2024 в 16:48
-
Запись от sporta1982 размещена 01.07.2024 в 17:28
-
Запись от Catstail размещена 02.07.2024 в 06:11
-
Запись от Fulcrum_013 размещена 02.07.2024 в 06:29
-
Запись от sporta1982 размещена 02.07.2024 в 09:09
-
Участвовал/читал в нескольких обсуждение данной темы (правда может лет 10 уж прошло) - вообще не помню, чтоб кто то приводил это в качестве аргумента
Сообщение от Catstail

В подавляющем большинстве случаев использую именно префиксный вариант, мне он кажется в принципе более логичным. И лишь когда это явно необходимо постфиксный. Правда я к тому же избегаю писать их внутри других выражений. И такой сложился именно на основании тех чтений/обсуждений.
Это компилировалось с оптимизацией? Не пробовали без оптимизации?
Сообщение от Catstail
Как "идея" может это мнение про относительно заметную разницу в производительности сложилось давно и просто передавалось "из поколение в поколение"... Где то в средине 90ых переносил один научный расчет с паскаля на асм и это дало очень сильный прирост производительности. (типа стало часов 5 против 3 дней до переноса). Потом уже в начале нулевых повторил эксперимент (правда на более простых формулах, но все же) и профита такого не вышло - т.е. компиляторы становятся умнее.Запись от voral размещена 02.07.2024 в 11:06
-
Запись от Fulcrum_013 размещена 03.07.2024 в 18:05
-
Запись от Royal_X размещена 03.07.2024 в 19:13
-
Запись от CoderHuligan размещена 04.07.2024 в 05:53
-
В чем проблемы вы видите в этой записи?
Сообщение от CoderHuligan
Как раз таки тому, кто не понимает разницы скорее больше "радости" доставит постфиксный вариант. Т.к., по опыту, новички сначала думать что i++ это замена i = i +1. И начинают так писать в формулах типа 10 * (i+1) заменяя на 10 * i++ получая необъяснимое и невероятное.Запись от voral размещена 04.07.2024 в 08:03
-
Т.е. логика, на мой взгляд такая:
В большинстве случаев осуждается стиль когда когда несколько инструкций пишутся в одну строку. типа
это плохо (и я так тоже считаю) и это признак Г кода. По сути следующий код из той же серииC++ 1
scanf("%s", name); printf("Your name is %s.", name);
Нижеследующий вариант еще хуже с точки зрения читабельности. Т.к. он делает "неявной" инструкцию. По крайней мере для новичков.C++ 1
b = 10 * i; i = i + 1;
Таким образом, как раз таки именно постфиксная запись , с точки зрения стиля кода, имеет очень узкую "полосу применения".C++ 1
b = 10 * i++;
С точки зрения производительности.... Ну тут, подозреваю, это касается узкого круга задач, в которых профит и в такт процессора это круто. (и опять же как я понмиаю, перевес в сторону префиксного)Запись от voral размещена 04.07.2024 в 08:28
-
Проблемы в понимании. Любое понимание требует времени. времени всегда мало. Почему я должен гадать на кофейной гуще: 10+++i+9???
Я вовсе не должен этого делать. если в коде нечто подобное встретится в топку такой код. То естья, читая, код на этой строчке стопорюсь и стопорюсь надолго, теряя драгоценное время. Я ценю свое время. То что в Си ввели эти вещи было ошибкой. Это сделало код более лаконичным но не более понятным. А понятность кода это критерий правильной архитектуры языка.Запись от CoderHuligan размещена 04.07.2024 в 09:36
-
А при чем тут выбор "постфикс" vs "префикс"?
Сообщение от CoderHuligan
Вам запись 10+i+++9 сразу становится понятнее что ли?Запись от voral размещена 04.07.2024 в 09:41




