C语言 递归程序 求解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 递归程序 求解相关的知识,希望对你有一定的参考价值。
求各位哥哥,解答一下,写一下这个递归程序的计算过程,还有计算递归有什么好方法吗?希望讲解一下 ,谢谢!
递归函数就是做了一件事:求和递归过程如下:
第一次进入:n==3, 执行的是 p[0]+f(&p[1],2);这样的话会继续调用函数f,也就有了第二次进入。
第二次进入:表达式变成了p[0]+p[1]+f[&p[1],1],这样的话会继续调用函数f,也就有了第三次进入。
第三次进入:n==1, p[0]+p[1]+p[2].
return (p[0]+f(&p[1],2)=p[0]+p[1]+f[&p[1],1]=p[0]+p[1]+p[2])-->return p[0]+p[1]+p[2]
递归一般是出于效率的要求,当然你这个没什么影响。递归也不是用在这里的。看递归要干什么很简单,看两点:1.递归退出条件是什么,退出时的返回值;2.递归时在做什么。 参考技术A
递归的意思就是说,原本我要写一大堆函数,每个函数内语句都一致,然后嵌套调用,简单写将这些重复内容的函数写成一个,用递归方式调用。在理解和解析时,可以这么考虑:每次调用的函数都是独立的,参数即使同名,但对于每次调用函数本身与其他函数是独立的,函数内部定义的变量值也独立不会互相干扰。
s=f(&aa[0],3); //调用f函数,等待返回值,f执行结束后再赋值f1(p=&aa[0],n=3 ): n>1成立,p[0]+f(&p[1],n-1); //等待新调用的f函数返回,然后继续执行
因为p指向aa[0],因此p[0]就是aa[0],p[1]为aa[1]
f2(p=&aa[1],n=2): n>1成立,p[0]+f(&p[1],n-1);
f3(p=&aa[2],n=1): n>1不成立,return p[0]; 返回aa[2]的值
f2(p=&aa[1],n=2): p[0]=aa[1]=4,f(&p[1],n-1)=aa[2]=6, 返回10
f1(p=&aa[0],n=3 ): p[0]=aa[0]=2,f(&p[1],n-1)=10, 返回12 //前面提到的f返回了,因此继续执行
s=12赋值完成
printf输出12换行
计算1!+2!+3!...+(n-1)!+n!。设计求解该问题的C语言程序,阶乘的计算使用递归函数实现
程序运行后输入n,当n=5时输出结果如下图所示
用递归并不是很好,每次递归调用都要有一定的时间和空间的开销,当n不大时还可以,当n大到一定程度就会出现堆栈溢出,程序崩溃。作为练习或是算法描述是可以的。
该问题如果不用递归算法实现阶乘可以做的更有效率。
递归算法:
#include<iostream>
using namespace std;
long int fun(int n)
if(n==1)return 1;
return ((long int)n)*fun(n-1);
int main()
long int S=0;
int n;
cout<<"请输入一个正整数"<<endl;
cin>>n;
for(int =1;i<=n;i++)
S+=fun(i);
cout<<"S="<<S<<endl;
非递归算法
#include <iostream>
using namespace std;
int main()
long int S;
long int T=1;
int n;
cout<<"请输入一个正整数"<<endl;
cin>>n;
for(int i=1;i<=n;i++)
T=(long int)i*T;
S=S+T;
cout<<"S="<<S<<endl;
参考技术A #include <stdio.h>
#include <stdlib.h>
fun(int x);
int main(void)
char *pszBuff = NULL;
int a;
int i=1;
int sumResult = 0;
printf("input a int number::");
scanf("%d", &a);
for(i=1;i<=a;i++)
int tmp = fun(i);
sumResult = sumResult + tmp ;
printf("%d!=%d, 1-%d的阶乘的和为%d\n",i,tmp,sumResult );
return 0;
int fun(int x)
int ret;
if(x == 1) return 1;
ret = fun(x-1)*x;
return ret;
本回答被提问者采纳 参考技术B #include<stdio.h>
void main()
int n,i,j;
long num=1,sum=0;
printf("input a int number::");
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
num*=j;
sum+=num;
printf("%d!=%d, 1-%d的阶乘的和为%d\n",i,num,i,sum);
num=1;
sum=0;
参考技术C #include <stdio.h>
int jiecheng(int x)
int sum=1;
int i;
for(i=1;i<=x;i++)
sum=sum*i;
return sum;
main()
int n,i,j,sum=0;
printf("求阶乘\n");
printf("请输入一个数N:N<10\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
printf("%d!的阶乘为%d ",i,jiecheng(i));
for(j=1;j<=i;j++)
sum=sum+jiecheng(j);
printf(" 1-%d!的阶乘和为%d\n",i,sum);
sum=0;
以上是关于C语言 递归程序 求解的主要内容,如果未能解决你的问题,请参考以下文章