Почему указатели и рекурсия рассматриваются как сложные проблемы? - PullRequest
6 голосов
/ 07 октября 2009

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

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

Обновление : Что можно сделать, чтобы улучшить навыки работы с указателями и рекурсией, если можно так выразиться?

Спасибо.

Ответы [ 8 ]

22 голосов
/ 07 октября 2009

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

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

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

4 голосов
/ 07 октября 2009

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

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

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

2 голосов
/ 23 октября 2009

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

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

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

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

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

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

2 голосов
/ 07 октября 2009

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

На самом деле есть статья Джоэля, которая немного отвечает на ваш вопрос: в Партизанском руководстве по интервью (версия 3.0) , он говорит (оригинальные акценты):

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

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

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

2 голосов
/ 07 октября 2009

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

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

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

1 голос
/ 07 октября 2009

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

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

1 голос
/ 07 октября 2009

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

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

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

0 голосов
/ 07 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...