c语言-C语言递归函数C语言递归函数C语言递归函数

问题描述

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;

时间: 2024-12-03 09:47:30

c语言-C语言递归函数C语言递归函数C语言递归函数的相关文章

【Go语言】【13】再谈GO语言的结构体

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qingkechina.blog.51cto.com/5552198/1671842 本文从如下四个方面再领着大家认识结构体 匿名结构体和匿名成员的结构体 值传递和引用传递 再谈嵌套结构体 面向对象 1.匿名结构体和匿名成员的结构体 如上篇所述,一个结构体需要先声明,再初始化,最后把初始化后的结构体赋值给其它变量,例如: /*声明结构体*/ type employee struc

《R语言编程艺术》——1.4 R语言中一些重要的数据结构

1.4 R语言中一些重要的数据结构 R有多种数据结构.本节将简单介绍几种常用的数据结构,使读者在深入细节之前先对R语言有个大概的认识.这样,读者至少可以开始尝试一些很有意义的例子,即使这些例子背后更多的细节还需要过一段时间才能揭晓.1.4.1 向量,R语言中的战斗机 向量类型是R语言的核心.很难想象R语言代码或者R交互式会话可以一点都不涉及向量. 向量的元素必须属于某种"模式"(mode),或者说是数据类型.一个向量可以由三个字符串组成(字符模式),或者由三个整数元素组成(整数模式),

请问java语言中的样条插值算法在vfp程序语言中调用获取的思路是什么?相关的例程在哪里找?

问题描述 请问java语言中的样条插值算法在vfp程序语言中调用获取的思路是什么?相关的例程在哪里找? 请问java语言中的样条插值算法在vfp程序语言中调用获取的思路是什么?相关的例程在哪里找? 解决方案 http://download.csdn.net/detail/zjjxinanjd/5236561

c语言编译,想自己动手写c语言的编译程序(只完成 分析到生成中间代码部分)

问题描述 c语言编译,想自己动手写c语言的编译程序(只完成 分析到生成中间代码部分) 我们编译原理快学完了,想自己动手写c语言的编译程序(只完成 分析到生成中间代码部分) 我应该如何入手写这个东西,查阅什么资料,反正有什么建议或者能帮助我完成的,给我说说就好 解决方案 windows下安装VC,或者VS 使用教程网上多的是 解决方案二: http://book.douban.com/subject/26339438/http://www.cnblogs.com/Ninputer/archive/

eclips语言中怎么样编写五子棋游戏?eclips语言编写五子棋人机对战怎么做?

问题描述 eclips语言中怎么样编写五子棋游戏?eclips语言编写五子棋人机对战怎么做? eclips语言中怎么样编写五子棋游戏?eclips语言编写五子棋人机对战怎么做? 解决方案 http://blog.sina.com.cn/s/blog_6caeccff0100pq31.html

C语言打印杨辉三角示例汇总_C 语言

杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一.在高中的时候我们又知道,杨辉三角的任意一行都是的二项式系数,n为行数减1.也就是说任何一个数等于这个是高中的组合数.n代表行数减1,不代表列数减1.如:第五行的第三个数就为=6. 现在我们按第一种思路来写:先定义一个二维数组:a[N][N],略大于要打印的行数.再令两边的数为1,即当每行的第一个数和

详解C语言编程中预处理器的用法_C 语言

预处理最大的标志便是大写,虽然这不是标准,但请你在使用的时候大写,为了自己,也为了后人. 预处理器在一般看来,用得最多的还是宏,这里总结一下预处理器的用法. #include <stdio.h> #define MACRO_OF_MINE #ifdef MACRO_OF_MINE #else #endif 上述五个预处理是最常看见的,第一个代表着包含一个头文件,可以理解为没有它很多功能都无法使用,例如C语言并没有把输入输入纳入标准当中,而是使用库函数来提供,所以只有包含了stdio.h这个头文

C语言求幂计算的高效解法_C 语言

本文实例演示了C语言求幂计算的高效解法.很有实用价值.分享给大家供大家参考.具体方法如下: 题目如下: 给定base,求base的幂exp 只考虑基本功能,不做任何边界条件的判定,可以得到如下代码: #include <iostream> using namespace std; int cacExp(int base, int exp) { int result = 1; int theBase = 1; while (exp) { if (exp & 0x01) result =

基于C语言实现五子棋游戏完整实例代码_C 语言

本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解. 五子棋游戏代码如下: /* * 使用键盘的上下左右键移动棋盘,空格键表示下棋,ESC键退出程序 */ #include <stdio.h> #include <stdlib.h> #include <bios.h> #include <graphics.h> #include<malloc.h> /* * 对应键盘键的十六进制数字 */ #defi

C语言中求余弦值的相关函数总结_C 语言

C语言cos()函数:求余弦值头文件: #include <math.h> cos() 函数用来求余弦值,即求角的临边长度除以斜边长度的比值,其原型为:     double cos(double x); [参数]x 为一个弧度. [返回值]返回-1 至1 之间的计算结果. 弧度与角度的关系为: 弧度 = 180 / π 角度 角度 = π / 180 弧度 使用 rtod( ) 函数可以将弧度值转换为角度值. 注意,使用 GCC 编译时请加入-lm. [实例]求两个角度的余弦值并输出, #i