Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Рекурсия..

Featured Replies

Искам да помоля за разяснение по няколко кода, разбирам главната идея на рекурсията, но не разбирам последователността при изкарване на екран на този код:

using namespace std;

char a,b,c=0,d;

int Function (char m)
{
    if (m=='c')
    {
        cout<<"yes ";
        return 1;
    }
    else return Function(m+1);
}
int main()
{
   a='a'; b='d';
   cout<<a<<" "<<b<<" "<<Function(b-a);
    return 0;
}

На екрана излиза ' yes a d 1' 

При положение, че cout-a е в друг ред, защо нещата се получават така? 

 

И тази .. 

#include <iostream>

using namespace std;

char *str="Hello";

void Function (char m)
{
    if (*(m+str)=='\0')
    cout<<"No";
    else
    {
        cout<<*(m+str);
        Function(m+1);
    }

}
int main()
{
   Function(5);
    return 0;
}

Какво се случва с този стринг? Нещо от рода на, че ако петият символ, в случая, от Hello е краят, извеждаме Не?

Рекурсията използва програмния стек.

Логиката е ласт ин, фърст аут или както е казал поета, първите паднаха в кърви, последните станаха първи.

Стека обръща реда на обратно.

За да се ориентираш пробвай това

 

using namespace std;
void f(int a)

{

	if(a==10){
		return;
        }


	f(a+1);
	cout << a << endl;

}
int main(){

    f(0);
    

    return 0;
}

Защо наобратно печати от 0 до 9?

Това че е рекурсия не значи непременно, че ще е наобратно.

void f(int a)
{
   if(a==10)return;
   cout << a << endl;
   f(a+1);
}

 

Редактирано от ined (преглед на промените)

преди 22 часа, Реджеп Иведик написа:

Рекурсията използва програмния стек.

Това е за реда на съхраняване и възстановяване на контекста. Какво прави и кога обаче функцията с тоя контекст си е тотално друга бира. В идеалния (което не е практиката естествено) случай, изобщо не трябва да се съобразяваш с тоя стек или да знаеш че съществува - то затова не ти е даден контрол над него във 99% от езиците.

Реално, когато base кейсът се изпълни почва изпълнението на реда след рекурсивното извикване на функцията, тоест в моя код от 9 до 0, защото при 10 рийчва base case и функцията изпълнява следващият ред cout. След това предишното извикване на функцията си изпълнява cout-а и така до 0.

на 06/11/2016 в 15:20, Ммм написа:

 

Искам да помоля за разяснение по няколко кода, разбирам главната идея на рекурсията, но не разбирам последователността при изкарване на екран на този код:

 


using namespace std;

char a,b,c=0,d;

int Function (char m)
{
    if (m=='c')
    {
        cout<<"yes ";
        return 1;
    }
    else return Function(m+1);
}
int main()
{
   a='a'; b='d';
   cout<<a<<" "<<b<<" "<<Function(b-a);
    return 0;
}

На екрана излиза ' yes a d 1' 

При положение, че cout-a е в друг ред, защо нещата се получават така? 

 

И тази .. 


#include <iostream>

using namespace std;

char *str="Hello";

void Function (char m)
{
    if (*(m+str)=='\0')
    cout<<"No";
    else
    {
        cout<<*(m+str);
        Function(m+1);
    }

}
int main()
{
   Function(5);
    return 0;
}

Какво се случва с този стринг? Нещо от рода на, че ако петият символ, в случая, от Hello е краят, извеждаме Не?

В първия пример единственото, за което се сещам и което може би предизвиква този резултат, е някаква техническа спецификация на самия език, за която не всеки е наясно, все пак C++ е език, който не се учи лесно. Когато имаш някаква такава "аномалия" винаги се пробвай да разбиеш целия израз на по-малки. В случая запиши

cout<<a<<" "<<b<<" "<<Function(b-a);

като

cout<<a<<" "<<b<<" ";

cout<<Function(b-a);

Във втория код, просто проверява дали даден символ спрямо началото, е символът за край на низ. Ако е, изписва "No", в противен случай отпечатва символът към когото указателят (след като му е добавена стойността m) сочи и увеличава подадената променлива и пак извиква функцията, която отново прави същата проверка.

преди 22 минути, programprogram написа:

В първия пример единственото, за което се сещам и което може би предизвиква този резултат, е някаква техническа спецификация на самия език, за която не всеки е наясно, все пак C++ е език, който не се учи лесно. Когато имаш някаква такава "аномалия" винаги се пробвай да разбиеш целия израз на по-малки. В случая запиши

опа, и аз се обърках тука... Това не е дефинирано в стандарта. И съответно не трябва да се прави, щото на два компилатора или дори един компилатор с различен флаг за оптимизация може да върне два различни резултата.

 

Редактирано от flare (преглед на промените)

Архивирана тема

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

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.