這個(gè)應(yīng)該是計(jì)算階乘的遞歸函數(shù)
創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十年時(shí)間我們累計(jì)服務(wù)了上千家以及全國政企客戶,如成都輕質(zhì)隔墻板等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過硬的技術(shù)實(shí)力獲得客戶的一致稱贊。
其實(shí)遞歸函數(shù)的結(jié)構(gòu)很簡(jiǎn)單,一般是兩部分組成
1、判斷是否結(jié)束遞歸。
作用是結(jié)束遞歸調(diào)用,遞歸調(diào)用不可能無限的調(diào)用下去,要不然成了死循環(huán)了,呵呵
所以要有一個(gè)結(jié)束的條件,如這里的if(n==0||n==1) return 1
2、調(diào)用本身(或者其他函數(shù)(有雙線遞歸和多線遞歸))
這里就是遞歸的本質(zhì)函數(shù)了,他有兩個(gè)地方要注意
1)就是遞歸的公式,以什么條件來運(yùn)算
這里的公式是遞歸函數(shù)的返回值和參數(shù)相乘
2)就是需要改變函數(shù)的參數(shù),要不然也會(huì)成為死循環(huán)
這里是fac(n-1),這個(gè)n-1就是改變了參數(shù)
多線遞歸和這個(gè)也差不多,只有一個(gè)地方不同,就是調(diào)用的函數(shù)不是本身,是另一個(gè)遞歸函數(shù)
如a調(diào)用b,b在調(diào)用c,c調(diào)用a等等
#include?iostream
#include?algorithm
#include?string
#include?cstdlib
#include?set
#include?cmath
#include?cstdio
#include?cstring
#include?vector
#include?map
#include?stack
#include?queue
#include?cctype
#define?LL?long?long
using?namespace?std;
const?LL?inf?=?1e18;
const?LL?mod?=?1e9+7;
int?s[10]?=?{1,?3,?6,?10,?15,?21,?27};
int?m;
void?f(int?n,?int?k,?int?cnt)?{
if(n?==?1)?{
return;
}
else?if(cnt?==?0)?{
cnt?=?m?-?k?-?1;
k?=?m;
f(cnt?+?1,?k,?cnt);
printf("%d\n",?cnt?+?1);
}else?{
f(n?+?k,?k?-?1,?cnt?-?1);
printf("%d?",?n?+?k);
}
}
int?main()?{
//1?3?6?10?15?21?27
//1?2?3?4??5??6??7
//s?=?(1?+?n)?*?n?/?2
int?n;
while(scanf("%d",?n)?!=?EOF)?{
int?k?=?lower_bound(s,?s?+?7,?n)?-?s;
m?=?k;
f(k?+?1,?k,?k);
printf("%d\n",?k?+?1);
}
return?0;
}
效果
倉促之間寫出,也就這樣了
這問題實(shí)在是有意思啊,主要是比較忙,我其實(shí)還想好好想想,為了財(cái)富值直接回答了
請(qǐng)用c++來編譯,也就是g++編譯器,頭文件有的沒用,懶得去掉了,你可以輸入類似這種格式的數(shù)據(jù)來試驗(yàn),不過最大也就是數(shù)組里面最大的,別超出。
注:輸入數(shù)據(jù)格式請(qǐng)看代碼s數(shù)組
寫的不太好,不要介意
求采納,謝謝
這是一個(gè)遞歸調(diào)用fun(x)的算法。
首先會(huì)計(jì)算x=1時(shí),因?yàn)閤是int型,所以x/2==0,返回1,所以打印1.
然后再計(jì)算x=2時(shí),這時(shí)返回x%2=0,所以打印0;
再計(jì)算x=4時(shí),同樣返回x%2=0,所以打印0;
最后計(jì)算x=8時(shí),返回x%2=0,所以打印0。
所以屏幕輸出的就顯示1000 。
首先要理解遞歸的概念,先遞后歸
開始遞
get(1) n=1不成立,執(zhí)行else
get(2) n=2不成立,執(zhí)行else
get(3) n=3不成立,執(zhí)行else
get(4) n=4不成立,執(zhí)行else
get(5) n=5不成立,執(zhí)行else
get(6) n=6不成立, 執(zhí)行else
get(7) n=7不成立, 執(zhí)行else
get(8) n=8不成立, 執(zhí)行else
get(9) n=9不成立 執(zhí)行else
get(10) n=10成立,返回值1
開始?xì)w!
get(10) num=1
get(9) get(n+1)*2+2 = 1*2+2=4 //這里說下為什么不在遞的時(shí)候計(jì)算else呢?因?yàn)樵谶f的時(shí)候我們并不知道他們上一次的值,所以是沒辦法計(jì)算的,這里get(n+1)已經(jīng)知道了上一次的值get(10)是1。
get(8) get(n+1)*2+2 = 4*2+2 =10
get(7) get(n+1)*2+2 = 10*2+2 = 22
get(6) get(n+1)*2+2 = 22*2+2 = 46
get(5) get(n+1)*2+2 = 46*2+2 = 94
get(4) get(n+1)*2+2 = 94*2+2 = 190
get(3) get(n+1)*2+2 = 190*2+2 = 382
get(2) get(n+1)*2+2 = 382*2+2 = 766
get(1) get(n+1)*2+2 = 766*2+2 = 1534
至此遞歸條件結(jié)束
遞歸函數(shù)有三點(diǎn)要求:
1,遞歸的終止點(diǎn),即遞歸函數(shù)的出口
2,不斷的遞歸調(diào)用自身
3,遞歸函數(shù)主體內(nèi)容,即遞歸函數(shù)需要做的事情
ps:3一般可以放在2的前面或者后面,一般1放最前面。另外,2和3可以根據(jù)不同的需要合并,比如,有時(shí)候遞歸函數(shù)的主體就是返回調(diào)用下層函數(shù)所得到的結(jié)果。
具體例子如下:
void?fun(int?n)
{
if(n=0)?return;???//1?這是遞歸的終點(diǎn),即出口
fun(n-1);????????//2、遞歸函數(shù)自身的調(diào)用
coutnendl;?????//3?遞歸函數(shù)的主體內(nèi)容
}
2,3合并的情況
int?fun(int?n)
{
if(n=0)?return?0;
return?fun(n-1)+fun(n-2);??//2?3合并
}
專門在遞歸函數(shù)中設(shè)置一個(gè)形式參數(shù)求各個(gè)數(shù)字的階乘。代碼如下:
代碼文本:
#include "stdio.h"
int f10(int m,int n){
return n11 ? m+f10(m*(n+1),n+1) : 0;
}
int main(int argc,char *argv[]){
printf("1!+2!+3!+...+10! = %d\n",f10(1,1));
return 0;
}