问题描述
- C语言递归函数C语言递归函数C语言递归函数
-
#include<stdio.h> #include<stdlib.h> //用递归函数来计算N的阶乘 double factorial(int n) { double result; if(n<0) { printf("输入错误 "); } else if(n==1 ||n==0) { result=1; } else { result=factorial(n-1)*n; //n=5 5-1=4 4*5=20 接下来该怎么算呢 麻烦前辈指点一下! } return result; } int main () { double n ; scanf("%lf",&n); printf("%lf的阶乘=%g ",n,factorial(n)); printf("%lf的阶乘=%lf ",n,factorial(n)); return 0; }
解决方案
就这就结束了啊,你运行程序了没有?result=factorial(n-1)*n,factorial(n-1)会返回(n-1)!,这样factorial(n-1)*n就是n!,最后返回result
解决方案二:
result=factorial(n-1)*n; //n=5 5-1=4 4*5=20 接下来该怎么算呢 麻烦前辈指点一下!
不是4*5啊,是 result=factorial(4)*5;
会接着调用factorial(4),factorial(3),factorial(2),直到factorial(2),才有返回1,依次返回。
解决方案三:
#include
#include
//用递归函数来计算N的阶乘
double factorial(int n)
{
//-------------------------------------------------------------
// double result;
// 每次需要记录 result 设置局部静态变量可以达到递归的目的
//-------------------------------------------------------------
static double result;
if(n<0)
{
printf("输入错误
");
}
else if(n==1 ||n==0)
{
result=1;
}
else
{
result=factorial(n-1)*n; //n=5 5-1=4 4*5=20 接下来该怎么算呢 麻烦前辈指点一下!
}
return result;
}
int main ()
{
double n ;
scanf("%lf",&n);
printf("%lf的阶乘=%g
",n,factorial(n));
printf("%lf的阶乘=%lf
",n,factorial(n));
return 0;
}
解决方案四:
1.在不用递归的情况下,求b的n次方
2.用递归函数求b的n次方
递归的2个条件:
1.函数自己调用自己
2.必须有个明确的返回值......
答案就在这里:IOS开发---C语言-?递归函数
----------------------
解决方案五:
result=factorial(n-1)*n; //n=5 5-1=4 4*5=20 接下来该怎么算呢 麻烦前辈指点一下!
不是4*5啊,是 result=factorial(4)*5;
会接着调用factorial(4),factorial(3),factorial(2),直到factorial(1),才有返回1,依次返回。
解决方案六:
#include
#include
//用递归函数来计算N的阶乘
double factorial(int n)
{
double result;
if(n<0)
{
printf("输入错误
");
}
else if(n==1 ||n==0)
{
result = 1;
}
else
{
result=factorial(n-1)*n; //n=5 5-1=4 4*5=20 接下来该怎么算呢 麻烦前辈指点一下!
}
return result;
}
int main ()
{
double n ;
scanf("%lf", &n);
printf("%f的阶乘=%f
", n, factorial(n) );
printf("%f的阶乘=%f
", n, factorial(n) );
return 0;
}
解决方案七:
第一次调用factorial(n)的时候,系统需要将参数 n 和局部变量 result 存入栈中,当执行到 factorial( n-1 )*n的时候系统会把factorial(n-1)的参数 n - 1
和factorial(n - 1) 里面的局部变量result再次存入栈中,也就是说并不会先去执行factorial( n-1 ) * n 这个乘法运算,而是先去计算factorial( n-1 )的值,
同样当执行到factorial( n-1 )的时候,它调用的函数为factorial( n-1 ),此时传入的参数已经不是最初的 n 了,而成了 n - 1 ,而对于函数传参来说它的参数
n 并没有变,不过factorial( )函数每一次传进去的值都在变化,最初为 n = 5 , 则 factorial( 5) 中的 factorial( n-1 )*n,就是factorial( 4)* 5 ,这个时候会
调用factorial( 4 ) ,同样factorial( 4)中的factorial( n-1 ) * n 实际上是factorial( 3) * 4,以此下去直到factorial( 1 ) ,然后系统从栈中取出每一个函数局部变量的result值然后返回回去,想当于将 factorial( 1 )的result返回给factorial( 2) , 然后factorial( 2)*执行factorial( 1 ) * 2 ,计算出factorial( 2)中德result然后返回给factorial( 3),直到返回到factorial( 5 ),factorial( 5 )计算的result会返回给你的主函数,然后输出打印,说的有点啰嗦不知道你能不能看懂
解决方案八:
关键要理解递归的含义,
解决方案九:
比如输入5
factorial(5)
第一次嵌套 返回 5*factorial(4)
第二次嵌套 factorial(4)返回 4* factorial(3),加上第一次的5,就变成5*4* factorial(3);
第三次嵌套factorial(3)返回3* factorial(2),加上前面的,就变成5*4* 3*factorial(2)
依次类推....最后到5*4*3*2* factorial(1)。
factorial(1)返回1,所有结果就变成5*4*3*2*1;