Факториальная программа, использующая рекурсивную функцию в цикле c - PullRequest
0 голосов
/ 13 февраля 2012

Факториальная программа, использующая рекурсию в C с циклом while. Привет всем, спасибо за ваши ценные ответы.

  1. Вы все сказали использовать (если условие вместо while). Это правильно, я принимаю ваше предложение. Тогда почему бы мне не использовать время для поиска факториала с помощью рекурсивной функции.

  2. Кто-то сказал, while(n>1) - это бесконечный цикл. Но в этой программе значение n уменьшается в самой функции fact(n-1). Теперь в этой программе я поместил printf() и getch() после цикла while, чтобы узнать значение n. Функция printf() и getch() выполняется только тогда, когда условие while становится ложным.

Когда я запускаю эту программу, функция printf() и функция getch() выполняются повторно, а функция printf() возвращает n значение = 1. Поэтому я определяю, что значение n уменьшается. Тогда почему эта программа снова и снова выполняет цикл while?

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

Примечание: я использую Turbo C 3.0 для запуска этой программы,

#include<stdio.h>    
int fact(int n)
{    
    int x=1;    

    while(n>1)    
    {    
        x=n*fact(n-1);    
    }
    printf("N value after the while loop:%d",n);
    getch();
    return(x);    
}    

void main()    
{    
    int n,fact1;    
    scanf("%d",&n);    
    fact1=fact(n);    
    printf("%d",fact1);    
}

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

У вас есть бесконечный цикл.Строка fact(n-1) не уменьшает значение n.Он вызвал еще один вызов функции с меньшим n.

Так что, если вы вызываете fact(2), у вас есть вызов с n==2.В этой функции у вас есть бесконечный цикл, который вызывает fact(1).Во втором вызове, n==1, поэтому условие цикла ложно, и этот вызов печатает вашу строку и возвращает - в бесконечный цикл первого вызова (для которого n равно 2).

1 голос
/ 13 февраля 2012

Прежде всего, могу ли я предложить вам поставить такой запрос перед scanf? Странно, когда консоль запрашивает номер, когда нет текста с просьбой сделать это. Похоже, программа зависла.

printf("Give the value of n:");

Итак, чтобы исправить вашу программу, я бы предложил вам сделать что-то вроде примера ниже. Вы должны понимать, как работает рекурсия. Вы не можете просто вычислить число внутри while (). Вы должны что-то возвращать, иначе это бесконечный цикл.

#include<stdio.h>
int fact(int n)
{
    int x=1;

    while(n>1)
    {
        x = n*fact(n-1);
        return x;
    }
    return x;
}

void main()
{
    int n,fact1;
    printf("Please provide the value of \'n\':");
    scanf("%d",&n);
    fact1=fact(n);
    printf("Result is %d",fact1);

    return 0;
}
0 голосов
/ 14 января 2019

Здесь у меня есть довольно простой для понимания код для вас.Это очень коротко и эффективно.Конечно, я кодировал его с помощью рекурсии:

Единственный заголовок, который вам нужно включить, это stdio.h.

Main:

int main() {
unsigned long n;
scanf("%lu", &n);
printf("%lu\n", factorial(n));

}

Функция вычисления факториала:

 unsigned long factorial(unsigned long n) {
if (n==1) {
    return 1;
} else {
    return n * factorial(n-1);
}

}

Как видите, это довольно короткая и эффективная программа.Я использовал unsigned long, чтобы программа могла выводить и вычислять с очень длинными числами, не получая переполнения и тому подобное.Вам не нужен какой-либо цикл, только рекурсивная функция.

...