Хотя ваше решение отсчитать количество и использовать его вместо того, чтобы использовать временное значение, сэкономило несколько циклов памяти, оно более концептуально запутанно. Особенно в случае, когда математика занимает здесь все время, вы сохраняете только дроби.
Но это не причина, по которой вы должны тратить незначительное количество времени. Этот вопрос является причиной: вы потратили часы! Это касается даже самых опытных и умных программистов. Ошибки просто более сложны и выходят за рамки ответа от stackoverflow! Другими словами, принцип Питера применим и к кодированию.
Не совершайте ошибку, приобретая опыт, который поможет вам избежать рисков такого рода, чтобы сэкономить цикл или два. Вот почему Макконнелл в Code Complete перечисляет Humility как положительный атрибут программиста.
Вот решение, с которого вы, вероятно, подумали начать:
xy* points_on_circle(int amount, float radius)
{
xy* array = malloc(sizeof(xy) * amount);
float space = (PI * 2) / amount;
int index;
for (index=0;index<amount;index++) {
float theta = space * index;
array[index].x = sin(theta) * radius;
array[index].y = cos(theta) * radius;
}
return array;
}
Если вам нужна скорость, вы можете сделать крошечную вещь, поставив тэту за пределы цикла, равной 0, и добавлять «пробел» каждый раз, так как + обязательно будет дешевле, чем * в плавающей запятой.
ускорить его в 10 раз или больше?
Если вам нужна серьезная скорость, этот совет от answers.com даст вам улучшение в 10 раз, если вы все сделаете правильно:
По теореме Пифагорама x2 + y2
Радиус2. Тогда просто решить
для х или у, учитывая другой вместе с
радиус. Вам также не нужно
вычислить для всего круга - вы можете
вычислить для одного квадранта и генерировать
остальные три квадранта по симметрии.
Вы поколение цикл будет, для
Например, просто итерация от источника до
радиус как х дельта х, порождая у,
и отражая это в трех других
квадрант. Вы также можете рассчитать для
одна половина квадранта, и использовать оба
симметрия и отражение для генерации
остальные семь с половиной квадрантов.
Когда мне было 12 лет, я думал, что мне нравится рисовать кружок, используя sin и cos в графике 8 на моем atari 800. Мой двоюродный брат Марти (в последнее время работавший с робототехникой Microsoft) стер мою программу и реализовал вышеуказанное решение, используя только сложение в цикле, если я правильно помню, и нарисуйте тот же круг за 4 секунды вместо минуты! Если бы я не был крещен, я бы поклонился в поклонении. Жаль, что у меня нет удобного кода, но я бы поспорил, что немного погуглив его. Кто-нибудь?