用递归方式求出阶乘的值。递归的方式为: 5!=4!*5 4!=3!*4 3!=2!*3 2!=1!*2 1!=1 即要求出5!先求出4!。。

用递归方式求出阶乘的值。递归的方式为: 5!=4!*5 4!=3!*4 3!=2!*3 2!=1!*2 1!=1 即要求出5!先求出4!。。,第1张

#include<iostreamh>

#include<stdioh>

void digui(int x,int sum,int i){

if(i==1){

sum=x(x-1);

x=x-2;

i--;//判断是否为第一次

}

else{

sum=sumx;

x--;

}

if(x==1){

cout<<sum<<endl;//当阶乘到1的时候结束,输出所求阶乘值

}

else{

digui(x,sum,i);

}

}

void main(){

digui(5,0,1);

/5即是你要求的系数,0是两个数的积(第一次运算即为5x4),先让其初始值为0,1为指示号码,因为第一次的算法跟后面的递归不一样,

所以要分开判断,第一次后让i归0,执行后面的递归,因为第一次的总和sum=x(x-1),但后面的sum递归算法是sumx;

/

}

public class DiGui {

public static void main(String[] args) {

DiGui d = new DiGui();

Systemoutprint(dTT(20));

}

public double TT(int i)//写一个返回值为double 类型的方法,20的阶层值比较大int类型的值无法表示

{ //方法体比较简单

if(i <= 1)

{

return i;

}

else

{

return iTT(i-1);//方法自己调用自己呵呵。。。

}

}

}

#include<stdioh>

int fact(int n) //递归求阶乘

{if(n==0)return 1; //0!=1

return nfact(n-1); //阶乘函数的递归定义

int main()

{int n;

scanf("%d",&n);

printf("%d!=%d\n",n,fact(n)); //输出如:5!=120

return 0;

}

To

LZ:

当n==1时那么返回的不是1吗?这个函数的返回值应该是1才对

假设k==10;

在最后一次当n==1的时候,确实返回了1,但是,在之前的调用中,返回了

fun(10)

=

10fun(9)

=

109fun(8)

==

10982fun(1)

最后得到10的阶乘

To

applepath:

warning

C4715:

'fun'

:

not

all

control

paths

return

a

value

并不是所有流程都返回了值

因为if语句的范围并不影响到fun函数,即使你已经考虑了所有情况,但是编译器认为你的返回值不够也就是说,需要在最后添加一个并不需要的返回值来去掉这个警告就像你那样另外可以:

long

fun(int

n)

{

if(n>1)

return

nfun(n-1);

else

if(n==1)

return

1;

return

0;

}

另外程序可以这样改(当然,假设参数n总是合法的也就是假设n>=0)

long

fun(int

n){

if(n>1)

return

nfun(n-1);

return

1;

}

这样不用每次去else费时间

求阶乘n!和 Fibnoacci函数的递归与非递归

求N的阶乘,对于阶乘,一般的递归运算的函数可以为

long factorial(int n){

if(n <= 1)

return 1;

else

return n factorial(n-1);

}而非递归的运算函数可以表示为

long factorial( int n )

{

int result = 1;

while( n > 1 ){

result = n;

n -= 1;

}

return result;

}菲波那锲数列的定义都知道吧,是这样子的

它的递归函数都会写

long

fibonacci( int n )

{

if( n <= 2 )

return 1;

else

return fibonacci( n - 1 ) + fibonacci( n - 2 );

}

但是它的递归函数实在效率太低,重复计算的值相当的多,所以我们需要改进,使用循环

long

fibonacci( int n )

{

long next_older_result = 0;

long previous_result = 1;

long result = 1;

if( 1 == n)

return 0;

else if( 2 == n)

return 1;

int i = 2;

while(i < n){

i++;

next_older_result = previous_result;

previous_result = result;

result = previous_result + next_older_result;

}

return result;

}如果你仔细观察一下,你会发现以上两个的递归调用都是函数所执行的最后一项任务。这个函数是尾部递归

尾部递归很容易也成非递归的形式。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11676789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存