2013-08-06 7 views
1

привет, у меня есть этот кусок кода, который я кодировал на основе некоторых других рекурсивных и факториальных программ , но моя проблема в том, что я действительно запутался в том, как он сохранил значение и сохранил его, а затем вернул его в концеРекурсия в C++ Factorial Program

int factorialfinder(int x) 
{ 
    if (x == 1) 
    { 
     return 1; 
    }else 
    { 
     return x*factorialfinder(x-1); 
    } 
} 
int main() 
{ 
    cout << factorialfinder(5) << endl; 
} 

так 5 входит, и умножается на 4, снова и снова и снова вызывая его функцию, то он попадает в один и возвращает факториал ответ

почему? я понятия не имею, как он хранится, почему возвращается 1, возвращая фактический ответ, что он действительно делает?

+0

возможно дубликат [Понимание рекурсии] (http://stackoverflow.com/questions/717725/understanding-recursion) – Rapptz

+0

Потому что там были некоторые ... странно голосование все любезно обзор С.О. разметил вверх/вниз. – sehe

ответ

7

Recursion image from IBM developers website.

Источник: Фотография взята с: IBM Developers website

Просто взгляните на изображение выше, вы поймете это b Хум. Число никогда не сохраняется, но рекурсивно вызывается для вычисления вывода.

Поэтому, когда вы вызываете факт (4), текущий стек используется для хранения каждого параметра, поскольку рекурсивные вызовы происходят до factorialfinder (1). Итак, расчет выглядит следующим образом: 5 * 4 * 3 * 2 * 1.

int factorialfinder(int x)   
{ 
    if (x == 1)  // HERE 5 is not equal to 1 so goes to else 
    { 
     return 1; 
    }else 
    { 
     return x*factorialfinder(x-1); // returns 5*4*3*2*1 when x==1 it returns 1 
    } 
} 

Надеюсь, это поможет.

+2

Почему downvote? – JNL

+0

id хотел бы знать слишком – Borgleader

+0

@Borgleader Так же, я бы ответил, мой ответ тоже был опущен. – maditya

2

Рекурсивная функция разбивает большую проблему на более мелкие случаи.

Перебирая программе:

call factorialfinder with 5, result is stored as 5 * factorialfinder(4) 

call factorialfinder with 4, result is stored as 5 * 4 * factorialfinder(3) 

call factorialfinder with 3, result is stored as 5 * 4 * 3 * factorialfinder(2) 

call factorialfinder with 2, result is stored as 5 * 4 * 3 * 2 * factorialfinder(1) 

call factorialfinder with 1, result is stored as 5 * 4 * 3 * 2 * 1 

в сущности, он сочетает в себе результат стека вызовов factorialfinder, пока не упретесь базовый случай, в этом случае х = 1.

+1

Поскольку все это происходило в том же экземпляре, оно сохраняло ценность предыдущего, потому что это сила рекурсии, поэтому в значительной степени она опускается по цепочке одна за другой, вызывая ее собственную функцию, почему она сохранила ответ? im все еще не уверен, я думаю, потому что все это происходит с одной и той же переменной, поэтому, когда он добрался до одного, у него все еще были все предыдущие вычисления в цепочке, поэтому он был рассчитан, когда он попал в дело, почему ответ был возвращен? lol я все еще не понимаю, но я знаком с его полномочиями –

5

Возврат 1 не возвращает фактический ответ. Он просто возвращает ответ на звонок

factorialfinder(1); 

которое происходит в вашем коде.

В любой программе стек вызовов представляет собой пространство в памяти, которое используется для отслеживания вызовов функций. Пространство из этой памяти используется для хранения аргументов функции, а также возвращаемого значения этой функции. Всякий раз, когда некоторая функция A вызывает другую функцию B, A получает возвращаемое значение B из этого пространства.

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

Выражение if (x == 1) должно проверить, когда этот процесс должен быть остановлен. Возвращаемое значение F '' 'используется F' '. Возвращаемое значение F '' используется F '. Возвращаемое значение F 'используется F.

В факториале некоторого числа операция (n) * (n-1) * (n-2) * .... *() , Я выделил 1; это условие, которое проверяется.

+0

Не знаете, почему это было downvoted ... – maditya

+0

Я подниму его для вас. Не знаю, как люди делают правильные ответы без каких-либо объяснений. – JNL

+0

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

1

Ну, факториальную функцию можно записать с помощью рекурсии или нет, но основное соображение в рекурсии состоит в том, что этот использует системный стек, поэтому каждый вызов функции является элементом в системном стеке, например:

https://dl.dropboxusercontent.com/u/14246044/stack.png (извините за изображение, но я не имею репутацию размещать изображение :()

Другое соображение в функции рекурсии является то, что это один имеет два основных кусок кода:

  1. база дело
  2. Рекурсии случай

В базовом случае рекурсивная функция возвращает элемент более основного алгоритма, в этом случае этот элемент является 1, поскольку математически факториал номер один является 1, но вы не знаете, который является факториалом для другого числа, по этой причине вам нужно использовать формулу, и по этой причине вам нужно использовать рекурсивный случай, например

Факториал 5, процедура составляет: 5 * 4 * 3 * 2 * 1 = 120, обратите внимание, что вам нужно умножить каждый номер от верхнего значения до номера один, другими словами, до тех пор, пока не произойдет основной случай, который вы уже знали.

0
#include<iostream> 
using namespace std; 

int factorial(int n); 

int main() 
{ 
    int n; 

    cout << "Enter a positive integer: "; 
    cin >> n; 

    cout << "Factorial of " << n << " = " << factorial(n); 

    return 0; 
} 

int factorial(int n) 
{ 
    if(n > 1) 
     return n * factorial(n - 1); 
    else 
     return 1; 
} 
+0

Любые объяснения по теме могут быть полезны, а не просто отправлять какой-то код. –

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