2015-02-20 5 views
2

Здравствуйте, у меня есть вопрос о домашнем задании, в котором я застрял .. любой намек или советы будут оценили. вопросы:рекурсивно печатать n, n-1, n-2, ... 3,2,1,2,3, ... n

Напишите одну рекурсивную функцию в C++, которая принимает в качестве аргумента положительное целое число n, а затем напечатает n, n-1, n-2,...3,2,1,2,3,...n. Сколько рекурсивных вызовов делает ваш алгоритм? Какое худшее время работы вашего алгоритма?

Я застрял в первой части. писать рекурсивную функцию, которая печатает n, n-1, n-2,...3,2,1,2,3,...n

до сих пор у меня есть:

print(int n) 
{ 
    if (n==0) 
    return; 
    cout<<n<<" "; 
    print(n-1); 

return; 
} 

но это только отпечатки с n в 1 я потерял о том, как я бы напечатать от 2 к n, используя только один параметр и рекурсивно одиночная функция.

Я попытался это: что дает правильный вывод, но имеет петлю и имеет два параметра:

p and z has the same value. 

void print(int p,int z) 
{ 

if (p==0) 
    { 
     for(int x=2;x<=z; x++) 
      cout<<x<<" "; 
     return; 
    } 
    else 

    cout<<p<<" "; 
    print(p-1,z); 

return; 
} 

любой намек или советы очень ценятся спасибо.

так, что она работает сейчас, но у меня возникают проблемы понимания того, как (вопрос в комментарии):

void print(int n) 
{ 

if (n==1){ 
    cout<<n; 
    return; 
    } 
else 
    cout<< n; 
    print(n-1); // how does it get passed this? to the line below? 
    cout<<n; // print(n-1) takes it back to the top? 
return; 
} 
+0

СОВЕТ: возвратная степенная функция должна «ветер», а затем " размотать". Распечатайте что-нибудь в обоих случаях. – lurker

ответ

8

Выход вы хотите дублируется, так что вы можете иметь эту серию шагов:

print num 
recursive step on num-1 
print num again 

Это рекурсивный случай. Теперь вам нужен соответствующий базовый случай, на котором остановить рекурсию, что не должно быть затруднительным.


Учитывая псевдокод:

recursive_print(n): 
    if n == 1: 
     print 1 
     return 

    print n 
    recursive_print(n-1) 
    print n 

(Если вы предпочитаете, просто посмотрите на ваше решение, а).

Откроем его. Точка будет отмечена там, где мы имеем дело с печатью.

. recursive_print(3) // Haven't printed anything 
3 . recursive_print(2) 3 // Print the 3 
3 2 . recursive_print(1) 2 3 //Print 2 
3 2 1 . 2 3   // Print 1 
3 2 1 2 . 3   // Print 2 
3 2 1 2 3 .   // Print 3 

Каждое разворачивание функции дает нам 2 номера на противоположных сторонах, и мы строим вплоть до «1», а затем вернуться и распечатать остальные цифры.


«разворачивания» показано на рисунке: enter image description here

Если стирают функции и оставить себя с последовательностью команд, вы получите:

print 3 
    print 2 
     print 1 
    print 2 
print 3 

где каждый отступ означает другую функцию.

+0

, если базовый регистр равен n == 1? – ek1437

+1

@ EK7 У вас есть компилятор, попробуйте (или лучше, проследите его на бумаге). Если он не работает, измените и повторите. – Blob

+1

РАБОТАЕТ !!!!! omg Я сидел здесь через 5 часов, пытаясь это сделать. Спасибо! – ek1437

0

Ответ проще, чем вы думаете.

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

statement1 
f(); 
statement2 

statement1 выполняется, то F называется и делает это дело, а затем, после того, как F отделок, оператор2 выполняется.

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

Давайте подумаем о том, что делает ваша функция. Он печатает все числа от n до 0, а затем от 0 до n. На первом этапе вы хотите напечатать n, затем все числа от n-1 до 0 и от 0 до n-1 и напечатать другое n. Посмотрите, куда он идет?

Таким образом, вы должны сделать что-то вроде этого:

print(n) 
call f(n-1) 
print(n) 

Я надеюсь, что мое объяснение достаточно понятно.

0

Это больше хака - используя зЬй :: потока, а не рекурсий ...

void rec(int n) { 
    if (n==1) { cout << 1; return; } 
    cout << n; 
    rec(n-1); 
    cout << n; 
} 

int main() { 
    rec(3); 
} 

печатает

32123 
+2

Почему вы говорите, что у этого нет рекурсии? Ошибка –

+0

- я хотел сказать, что для этого вам нужна какая-то окружающая структура, но то, что я сказал, было просто глупо – r0fg1

Смежные вопросы