Почему указатели и рекурсия рассматриваются как сложные проблемы?

Поддержки F# единицы измерения , который может быть очень полезен для математической работы.

6
задан RonaldMunodawafa 21 November 2014 в 12:20
поделиться

8 ответов

Кто-то однажды сказал мне, и я согласен: указатели - это простая концепция, но их сложно закодировать, рекурсия - сложная концепция, но ее легко закодировать.

Указатели могут быть сложными для кодирования, потому что может быть неочевидно, где проблема, или даже что проблема есть - проблемы, вызванные указателями, могут не проявляться при первом, втором или даже сотом прогоне, но затем внезапно бац, у вас есть проблема. Отладка их также может быть очень сложной.

Рекурсию просто запрограммировать - просто вызовите функцию и сделайте что-нибудь, чтобы отслеживать, где вы находитесь. Сложность состоит в том, чтобы убедиться, что вы достаточно хорошо понимаете все возможные пути, по которым может идти ваша функция, и убедиться, что она всегда может выйти из цикла.

22
ответ дан 8 December 2019 в 02:41
поделиться

Они требуют хранения сведений о нескольких уровнях данных. Несколько уровней сложнее, чем один уровень.

Указатель сложнее, чем переменная значения. Это переменная сама по себе, но она используется для хранения адреса другой переменной. Вы должны понимать разницу между значением указателя и значением этой другой переменной.

Рекурсия сложнее простого кода с циклами, так как вам нужно понять, почему и как был сделан текущий вызов , какие еще вызовы будут сделаны, каков будет эффект, когда текущий вызов вернется, и как все это решит проблему. Это сложность. Добавьте к этому косвенное отречение (когда A () вызывает B () ,

4
ответ дан 8 December 2019 в 02:41
поделиться

Рекурсия достаточно проста для использования в LOGO - языке программирования, похожем на LISP, разработанном для легкого использования детьми младшего возраста. Это довольно интуитивно понятная концепция для многих основных применений.

С другой стороны, указатели кажутся сложными многим программистам, особенно тем, кто никогда не касался ассемблера. Особенно сбивает с толку тот факт, что C (и C ++) в основном обрабатывают массивы и указатели почти как взаимозаменяемые, хотя они часто представлены разными типами данных.

Например, разыменование массива указателей на 1D-массивы в исходном коде происходит точно так же. код в виде двухмерного массива, даже если они имеют совершенно разные схемы памяти и генерируют существенно другой машинный код, когда происходит разыменование.

2
ответ дан 8 December 2019 в 02:41
поделиться

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

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

Мне посчастливилось выучить паскаль и Си в качестве моего первого языка программирования, поэтому указатели и рекурсия были естественными и не казались сложными.

1
ответ дан 8 December 2019 в 02:41
поделиться

Это простые концепции, но их легко испортить.

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

1
ответ дан 8 December 2019 в 02:41
поделиться

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

0
ответ дан 8 December 2019 в 02:41
поделиться

почему указатели ... считаются сложными проблемами?

На самом деле есть статья Джоэла, которая слегка отвечает на ваш вопрос: в The Guerrilla Guide в интервью (версия 3.0) , он говорит (исходный курсив):

Я пришел к выводу, что понимание указателей в C - это не умение, это способность. В первый год классы информатики, есть всегда около 200 детей в начале семестра, все написали сложные приключенческие игры на BASIC для их ПК, когда им было 4 года. Они хорошо проводят время изучая C или Паскаль в колледже, пока однажды профессор представляет указатели, и внезапно они не получают это. Они просто не понимают больше ничего. 90% класса уходит и становится политологией майоры, то они рассказывают своим друзьям что не было достаточно красивой представители соответствующего пола в свои классы CompSci, поэтому они переключился. Почему-то большинство людей кажется рожденным без части мозг, который понимает указатели. Указатели требуют сложной формы двояко-косвенное мышление, что некоторые люди просто не могут, и это красиво имеет решающее значение для хорошего программирования. Полно «сценаристы», которые начали программирование путем копирования JavaScript фрагменты на свои веб-страницы и пошли на изучение Perl никогда не узнал о указатели, и они никогда не могут создавать код нужного вам качества.

Это источник всех этих знаменитых вопросы интервью, о которых вы слышите, например, «перевернуть связанный список» или «Обнаруживать петли в древовидной структуре».

Извиняюсь за большую цитату, но это все есть.

2
ответ дан 8 December 2019 в 02:41
поделиться

Понимание указателей требует концептуального понимания архитектуры памяти вашей компьютерной системы: каждый адрес в пронумерованной памяти - это слот, в который вы можете поместить данные, а некоторые из слотов содержат номера других слотов . Это нетривиально. Что еще более важно, это не требуется для простых программ. Обладание этим концептуальным пониманием и способность решать проблемы с его помощью, на мой взгляд, показывает желание выяснить, что на самом деле происходит в компьютере.

Кроме того, чтобы свободно владеть указателями, вам нужна практика. Подумайте о головоломках на языке C, например: «из приведенного ниже объявления опишите тип a словами»

int* (*)(int*[]) (a*[])(int *[]*, float[][]**);

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

Аналогичная история с рекурсией. Чтобы просто пройтись по рекурсивной функции, вы должны понимать стек вызовов и то, как аргументы передаются и возвращаются. Чтобы освоить рекурсивные функции, вы должны уметь разбивать проблему на более мелкие части и решать каждую по частям.

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

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

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