Это делает именно то, что вы хотите:
//This is the method that will be called from some other class
public static int printSequence(int n){
return printSequence(1, n);
}
/*We define this method, because the following code snippet
is used multiple times in the method 'printSequence(int, int)'
This method will simply print the numbers 1 - length*/
private static void printLooper (int length){
for(int i=1; i<=length; i++)
System.out.print(i);
System.out.print("\n");
}
/*This method has the logic. We give it 2 integers as parameters:
int start and int end. I think the names of the parameters are self-explanatory*/
private static int printSequence(int start, int end){
/*This is the TERMINATING condition, so it is placed first.
This part is really important. Always be aware of what type of recursion
you are using. More on this later..*/
if ( end == 1 ) {
printLooper(end);
return 0;
}
//OK. So, if start is less than end, then print 1 - start
if (start < end){
printLooper(start);
//then return method recursively, with start INCREMENTED by one
return printSequence(start+1, end);
}
/*Now, if start is equal to end, print number 1 - start, but this time,
return the method recursively with end DECREMENTED by one*/
else if (start == end){
printLooper(start);
return printSequence(start, end-1);
}
/*Now if start is larger than end, then that means that we need to start
printing the lower part of the 'number tree'. So, call printLooper()
to print 1 - end.*/
else if (start > end){
printLooper(end);
return printSequence(start, end-1);
}
return 0;
}
Что касается типов рекурсии и почему важно знать, какой тип функции вы пишете, посмотрите этот удивительный урок .
BLOCKQUOTE>
Ответ Joel хорош по причинам, которые Вы могли бы иметь для использования C, хотя существуют немногие другие:
В некоторых случаях, тем не менее, Вы могли бы хотеть использовать C, а не C++:
, Вы утверждаете, что могли просто использовать подмножество C и компиляцию с компилятором C++, но Вы найдете, что, если Вы делаете это, Вы получите немного отличающиеся результаты в зависимости от компилятора.
Невнимательный при выполнении этого Вы используете C. Ваш вопрос действительно, "Почему не делают программисты C используют компиляторы C++?" Если это, затем Вы или не понимаете языковых различий, или Вы не понимаете теорию компилятора.
Поскольку Вы пишете для системы, где ресурсы трудны (такие как встроенная система или некоторый добрый реальный код без операционной системы как ядро), и Вы хотите как можно меньше служебное.
существует причина, почему большинство встроенных систем не имеет компилятора C++ - не случается так, что люди не хотят один, случается так, что зубрежка код C++ в это маленькое пространство является задачей, которая приближается невозможный.
Какой необходимый C был лучшим препроцессором. cfront был один и таким образом перенесенный C++
, I'ld используют C, где 'C++ как препроцессор' не был бы хорошо.
я вполне уверен, у основания любой правильно написанной библиотеки/платформы/инструментария C++, Вы нашли бы dirty-old-c (или статические броски, который является тем же)
Существует также подход, который некоторые магазины проявляют использования приблизительно из функций C++ подобным C способом, но предотвращение, которые нежелательны. Например, с помощью классов и методов класса и перегрузки функции (которые обычно легки для даже C консерваторы для преодоления), но не STL, потоковые операторы и Повышение (которые более трудно изучить и могут иметь плохие характеристики памяти).
Я сказал бы, что C дает Вам лучший контроль над оптимизацией и эффективностью, чем C++ и следовательно был бы полезен в ситуациях, где память и другие ресурсы ограничены, и каждая оптимизация помогает. Это также имеет меньшее место, конечно.
Один комментарий о "просто использует подмножество C++, который Вы хотите использовать": проблема с этой идеей состоит в том, что она имеет стоимость для осуществления этого, все в проекте используют то же подмножество. Мое собственное мнение - то, что та стоимость довольно высока для слабо связанных проектов (например, с открытым исходным кодом), и также который C++ полностью привел к сбою будучи лучшим C, в том смысле, что Вы не можете использовать C++ везде, где Вы использовали C.
я не смог найти много доказательства относительно того, почему Вы хотели бы выбрать C over C ++.
можно едва назвать то, что я собираюсь сказать доказательство; это - просто мое мнение.
Люди как C, потому что это соответствует приятно в уме prgrammer.
существует много сложных правил C++ [при необходимости в виртуальных деструкторах когда можно назвать виртуальные методы в конструкторе, как перегрузка и переопределение взаимодействуют...], и осваивать их всех прилагает много усилий. Кроме того, между ссылками, перегрузкой оператора и перегрузкой функции, понимая часть кода может потребовать, чтобы Вы поняли другой код, который может или не может быть легок найти.
А другой вопрос в том, почему организации предпочли бы C по C++. Я не знаю, что, я - просто люди ;-)
В защиту C++, он действительно приносит ценные функции к таблице; тот, который я оцениваю больше всего, является, вероятно, параметрическим ('выход) полиморфизм, хотя: операции и типы, который берет один или несколько типов в качестве аргументов.
Это довольно мелко, но как занятой студент я выбрал C, потому что я думал, что C++ займет слишком много времени учиться. Многие преподаватели в моем университете не примут присвоения в Python, и я должен был взять что-то быстро.
Большинство значительных функций C++ так или иначе включает классы или шаблоны. Это замечательные функции за исключением способа, которым компилятор преобразовывает их в объектный код. Большинство компиляторов использует искажение имени и тех, которые не делают чего-то, по крайней мере, как грязного.
, Если Ваша система живет самостоятельно, как имеет место со многими приложениями, то C++ является прекрасным выбором.
, Если Ваша система должна взаимодействовать с программным обеспечением, не neccesarily записанным в C++ (наиболее часто в ассемблере или Библиотеках Фортрана) затем, Вы находитесь в трудном месте. Для взаимодействия с теми видами случаев необходимо будет отключить искажение имени для тех символов. это обычно делается путем объявления тех объектов extern "C"
, но затем они не могут быть шаблонами, перегруженными функциями или классами. Если это, вероятно, будут Ваши приложения API, то необходимо будет перенести их с функциями помощника и сохранить те функции в синхронизации с фактической реализацией.
И в действительности, язык C++ обеспечивает стандартный синтаксис для опций, которые могут быть легко реализованы в чистом C.
Короче говоря, издержки совместимого C++ слишком высоки, чтобы большинство людей выровняло по ширине.
Поскольку для многих задач программирования C более прост, и достаточно хорош. Когда я программирую легкие утилиты особенно, я могу чувствовать, что C++ хочет, чтобы я создал в изящном supersructure ради самого себя, вместо того, чтобы просто написал код.
OTOH, для более сложных проектов, элегантность обеспечивает более хорошую твердую структурную суровость, чем естественно вытек бы из моей клавиатуры.
Поскольку они хотят использовать функции в C99, которые не имеют эквивалентов в C++.
<час>Однако нет стольких функций C99, которые полезны для C++, сколько люди думают на первый взгляд. Массивы переменной длины? C++ имеет станд.:: векторы. Поддержка комплекса/мнимых чисел? C++ имеет шаблонный составной тип. Универсальные типом математические функции? C++ перегрузил стандартные математические функции, вызвав тот же результат.
Именованные инициализаторы? Не в C++, но существует обходное решение:
struct My_class_params {
int i;
long j;
std::string name;
My_class_params& set_i(int ii)
{
i = ii;
return *this;
}
My_class_params& set_j(long jj)
{
j = jj;
return *this;
}
template <typename STRING>
My_class_params& set_name(STRING&& n)
{
name = std::forward<STRING>(n);
return *this;
}
My_class_params()
{
// set defaults
}
};
class My_class {
My_class_params params;
public:
My_class(const My_class_params& p) : params(p) { }
...
};
Это позволяет Вам писать вещи как:
My_class mc(My_class_params().set_i(5).set_name("Me"));
Я удивлен ничьи упомянутые библиотеки. Много языков может связаться против C, освобождает, и вызовите функции C (включая C++ с экстерном "C"). C++ является в значительной степени единственной вещью, которая может использовать lib C++ (определенный как 'lib, который использует функции в C++, которые не находятся в C [таком как перегруженные функции, виртуальные методы, перегруженные операторы...], и не экспортирует все через совместимые интерфейсы C через экстерна "C"').
Поскольку они пишут, что сменный и C++ не имеет никакого стандартного ABI.
Долгое время компиляции может быть раздражающим. С C++ у Вас может быть очень долгое время компиляции (что означает, конечно, больше времени для Переполнения стека!).
В дополнение к нескольким другим моментам, упомянутым уже:
Меньше удивления
то есть, намного легче видеть то, что сделает часть кода, делают точно . В C++ необходимо приблизиться к уровню гуру, чтобы смочь знать точно, что кодирует компилятор, генерирует (попробуйте комбинацию шаблонов, множественного наследования, автоматических сгенерированных конструкторов, виртуальных функций и соединения в небольшом количестве волшебства пространства имен и зависимого поиска аргумента).
Во многих случаях это волшебство хорошо, но например в режиме реального времени системы оно может действительно завинтить Ваш день.
Ответ Linus на Ваш вопрос , "Поскольку C++ является ужасным языком"
, Его информация является неподтвержденной в лучшем случае но у него есть точка..
Являющийся большим количеством низкоуровневого языка, Вы предпочли бы его C++.. C++ является C с добавленными библиотеками и поддержкой компилятора дополнительных функций (, оба языка имеют функции, которые другой язык не делает и реализует вещи по-другому ), но если у Вас есть время и опыт с C, можно извлечь выгоду из дополнительных добавленных связанных с низким уровнем полномочий... [Отредактированный] (потому что Вы привыкаете к выполнению большего количества работы вручную, а не преимущества от некоторых полномочий, прибывающих из самого языка/компилятора)
Добавляющие ссылки:
, Почему Вы все еще используете C? PDF
я был бы Google для этого.. потому что уже существует много комментариев относительно сети
Я принимаю решение записать в C, потому что я люблю работать с маленьким, трудным языком. Мне нравится иметь доступ к стандарту, который может быть прочитан за разумное количество времени (для меня - я - очень медленный читатель). Кроме того, я использую его для записи программного обеспечения для встроенных систем, для которых немного желательных компиляторов C++ существуют (как приблизительно микроконтроллеры PIC).
Я получаю другое представление: почему использование C++ вместо C?
книга Язык программирования C (иначе: K& R) говорит Вам ясно, как сделать все, что язык может выполнить в менее чем 300 страницах. Это - шедевр минимализма. Никакая книга C++ даже не приближается.
очевидный контрдовод - то, что то же могло быть сказано относительно большинства, если не все, современные языки - они также не могут сказать Вам, как сделать все только на нескольких сотнях страниц. Верный. Итак, почему использование C++ вместо этого? Богатство функции? Питание? Если Вам нужно что-то более многофункциональное, или мощное затем идут с C#, Objective C, Java или чем-то еще как этот. Почему нагрузка самостоятельно со сложностями C++? Если Вам нужен уровень контроля предоставления C++ затем, я требую использовать C. C может сделать что-либо и может сделать это хорошо.
Страхи перед производительностью или чрезмерным увеличением размера не являются серьезным основанием воздержаться от C++. Каждый язык имеет свои потенциальные ловушки и торговлю offs - хорошие программисты узнают о них и, где необходимо разрабатывают стратегии преодоления, бедные программисты будут ссориться и обвинять язык.
Интерпретируемый Python во многих отношениях считается "медленным" языком, но для нетривиальных задач квалифицированный Python программист может легко произвести код, который выполняется быстрее, чем тот из неопытного разработчика C.
В моей промышленности, видеоиграх, мы пишем высокопроизводительный код в C++ путем предотвращения вещей, таких как RTTI, исключения или виртуальные функции во внутренних циклах. Они могут быть чрезвычайно полезными, но иметь производительность или чрезмерно увеличить размер проблем, которых желательно избежать. Если бы мы должны были пойти шаг вперед и переключиться полностью на C, то мы получили бы мало и потеряли бы самые полезные конструкции C++.
самая большая практическая причина предпочтения C состоит в том, что поддержка более широко распространена, чем C++. Существует много платформ, особенно встроенных, которые даже не имеют компиляторов C++.
существует также вопрос совместимости для поставщиков. В то время как C имеет стабильный и четко определенный ABI (Двоичный интерфейс приложений), C++ не делает. ABI в C++ более сложен из-за таких вещей, как vtables и constructurs/destructors так реализованы по-другому с каждым поставщиком и даже версиями набора инструментальных средств поставщиков.
В реальном выражении это означает, что Вы не можете взять библиотеку, сгенерированную одним компилятором, и связать его с кодом или библиотекой от другого, который создает кошмар для распределенных проектов или поставщиков промежуточного программного обеспечения двоичных библиотек.
Если Вы хотите, чтобы Ваш код был понят под фактически любой записью программиста в C.
О боже, C против C ++, отличный способ начать войну пламени. :)
Я думаю, что C лучше подходит для драйвера и встроенного кода.
C ++ имеет несколько замечательных функций, которых нет в C, но многие из объектно-ориентированных функций C ++ могут вызывать огромные беспорядки при написании кода, когда люди пишут код с неочевидные побочные эффекты, возникающие за кадром. Сумасшедший код может быть спрятан в конструкторах, деструкторах, виртуальных функциях ... Красота кода C заключается в том, что язык не делает ничего неочевидного за вашей спиной, поэтому вы можете читать код и не смотреть на каждый конструктор и деструктор и так далее. Большая часть проблемы - это неправильная практика кодирования НЕКОТОРЫМИ людьми.
Мой идеальный язык был бы комбинацией C99 плюс минимальное подмножество более безопасных возможностей C ++, которые добавляют НУЛЕВЫЕ (или почти нулевые) накладные расходы компилятора на двоичный вывод. Прекрасным дополнением будет инкапсуляция классов и концепции именования данных и функций.