c-没有从递归函数中获得所需的输出



当我使用与以下方法n=n*i不同的方法计算阶乘值时,输出为负值

#include <stdio.h>
int
foo(int x)
{
for (int i = 1; i < x; i++) {
x = x * i;
printf("%d ", x);
}
return 0;
}
int
main()
{
int x = 4, m;
m = foo(x);
printf(m);
return 0;
}

我得到的输出:

4 8 24 96 480 2880 20160 161280 1451520 14515200 159667200 1916006400 -861720576 
Process finished.

我认为更新相同的值会引起一些问题请帮助

对于初学者来说,您的函数不是递归的。:)

主中printf的此调用

printf(m);

不正确。函数printf的第一个参数具有指针类型const char * restrict

对于类型int,可以计算阶乘的最大有效数等于12:

12! = 479001600

条件是CCD_ 7等于CCD_。

最好使用函数unsigned long long int的返回类型。在这种情况下,可以计算阶乘的最大有效数等于20:

20! = 2432902008176640000

此外,函数参数应至少具有无符号整数类型unsigned int。将参数声明为具有带符号整数类型是没有意义的。

并且函数的返回值CCD_ 12没有意义。函数应返回计算出的阶乘。

此外,函数还错误地计算了有效值0的阶乘。13等于CCD_ 14。

功能可以通过以下方式声明和定义

unsigned long long int foo( unsigned int n )
{
unsigned long long int factorial = 1llu;
while ( n > 1 ) factorial *= n--;
return factorial;
}

如果你想写一个递归函数,那么它可以看起来像

unsigned long long int foo( unsigned int n )
{
return n < 2 ? 1llu : n * foo( n - 1 ); 
}

这是一个示范节目。

#include <stdio.h>
unsigned long long int foo( unsigned int n )
{
return n < 2 ? 1llu : n * foo( n - 1 );
}
int main( void )
{
const unsigned int MAX_FACTORIAL_VALUE = 20;
for (unsigned int i = 0; i <= MAX_FACTORIAL_VALUE; i++)
{
printf( "%u! = %llun", i, foo( i ) );
}
}

程序输出将看起来像

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000

如果你愿意,那么你可以使用上面显示的非递归函数来代替递归函数。

您也可以更改函数,使其向用户发出传递给函数的值太大的信号。一个简单的方法是例如以下

unsigned long long int foo( unsigned int n )
{
const unsigned int MAX_VALID_VALUE = 20;
if (MAX_VALID_VALUE < n) return -1;
unsigned long long int factorial = 1llu;
while (n > 1) factorial *= n--;
return factorial;
}

也就是说,如果传递的值不在可接受的范围内,则函数返回值( unsigned long long int )-1。。

然后你基本上可以写

#include <limits.h>
//...
unsigned long long int m = foo( some_value );
if ( m == ULLONG_MAX ) puts( "Error: too big value." );

这里有一些问题。主要的一个是for循环正在更改x,CCD_17用于指示何时停止循环。您需要使用不同的变量来跟踪结果。如果不是因为这个事实,你会有一个无限循环,int最终会缠绕起来并变成否定的。

循环使用i < x作为停止条件,但需要在等式中包含x。所以应该是i <= x

此外,函数返回0,而不是阶乘的结果。

最后,你有:

printf(m);

printf()不是这样工作的,你需要给它一个格式字符串来告诉它如何打印参数,例如

printf("%dn", m);

把所有这些放在一起,你可能会有:

int factorial(int x)
{
int result = 1;
for (int i = 2; i <= x; i++) {
result *= i;
printf("%d ", result);
}
return result;
}
int main()
{
int x = 4, m;
m = factorial(x);
printf("%dn", m);
return 0;
}

给予:

2 6 24 24
  1. 在递归实现中,不在循环中迭代
  2. printf首先需要格式
unsigned long long fact(unsigned int x) // as fact of the negative number is not defined
{
if(x) return x * fact(x - 1);
return 1;
}
int main(void)
{
unsigned long long m;
unsigned int x = 5;
m = fact(x);
printf("%llun", m);
return 0;
}

或者检查它是否没有溢出

unsigned long long fact(int x) // as fact of the negative number is not defined
{
if(x) 
if(x < 0 || x * (x - !x) < x ) return 0;
else return x * fact(x - 1);
return 1;
}
int main(void)
{
unsigned long long m;
int x = 120;
m = fact(x);
if(m) printf("%llun", m);
else printf("Undefinedn");
return 0;
}

相关内容

  • 没有找到相关文章

最新更新