遞推:知道第一個(gè),推出下一個(gè),直到達(dá)到目的。
為本溪等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及本溪網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、本溪網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
遞歸:要知道第一個(gè),需要先知道下一個(gè),直到一個(gè)已知的,再反回來,得到上一個(gè),直到第一個(gè)。
- -###
遞歸函數(shù)有兩個(gè)基本要素:一個(gè)是描述問題規(guī)模逐步縮小的遞歸算法,另一個(gè)是描述基本情況的遞歸終止條件
int Sum(int n)
{
if(n==1)
return 1;
else
return Sum(n-1)+n;
}
//遞歸法
int fibo1(int n)
{
if( n == 1 || n == 2) return 1;
else return fibo1(n-1)+fibo1(n-2);
}
//遞推法
int fibo2(int n)
{
int f0=1,f1=1,f;
if (n2)
return 1;
for(int i=2;in-1;i++)
{
f=f0+f1;
f0=f1;
f1=f;
}
return f;
}
區(qū)別:遞推是直接使用已知的條件去推出未知的條件;遞歸則是將大問題逐漸轉(zhuǎn)化為若干個(gè)相同的子問題,直到得到已知的最小子問題,再回溯依次得到父問題的答案。是由未知到已知,再?gòu)囊阎轿粗?。?duì)于復(fù)雜的問題,遞歸把問題簡(jiǎn)單化,讀起來易懂。
如題,輸入的參數(shù)是7,調(diào)用fun(7),進(jìn)入fun函數(shù),if判斷,此時(shí)x=7,if語(yǔ)句的condition為真,繼續(xù)調(diào)用fun函數(shù)fun(3)(7/2取整為3),進(jìn)入fun函數(shù),if判斷,此時(shí)x=3,if語(yǔ)句的condition為假,執(zhí)行if語(yǔ)句后的輸出語(yǔ)句,輸出3(此時(shí)x=3),返回上一層的fun函數(shù)調(diào)用(即是fun(7),因?yàn)榈谝淮握{(diào)用時(shí),還留這一句輸出語(yǔ)句沒有執(zhí)行),輸出7(此次fun函數(shù)調(diào)用x=7),主函數(shù)結(jié)束。函數(shù)執(zhí)行的解析:程序的執(zhí)行從主函數(shù)開始,一條一條語(yǔ)句執(zhí)行,語(yǔ)句存放在一定的數(shù)據(jù)空間里,這段空間就是代碼段,一般情況下程序是按代碼的地址順序執(zhí)行的,但是在函數(shù)調(diào)用,程序會(huì)暫停當(dāng)前的代碼的執(zhí)行,把下一條應(yīng)該執(zhí)行的代碼的地址放在另一個(gè)存儲(chǔ)空間里(其實(shí)是壓進(jìn)棧了),而轉(zhuǎn)去執(zhí)行調(diào)用的函數(shù)代碼,執(zhí)行完所有函數(shù)應(yīng)該被執(zhí)行代碼(是所有哦,當(dāng)然分支語(yǔ)句里的一些語(yǔ)句可以不執(zhí)行的),程序會(huì)把壓進(jìn)棧的指令地址取出來,繼續(xù)執(zhí)行下去,直到住程序結(jié)束。遞歸函數(shù)是一般函數(shù)用分支或者循環(huán)控制多次重復(fù)調(diào)用函數(shù)的情況。
遞推指的是一個(gè)函數(shù)中一個(gè)量的值要有其他的幾個(gè)變量或函數(shù)得到,比如 function()是一個(gè)函數(shù),在另一個(gè)函數(shù)里面要用到它時(shí),如下 int add() {int a; a=function() }這就是遞推。而遞歸指的是同一個(gè)函數(shù)的反復(fù)調(diào)用。比如去求一個(gè)數(shù)n的階乘時(shí)int jiec(n) {int n; int m; m=n*jiec(n-1); return jiec(n-1); }
是用遞歸做的(是你的要求吧?):
#include
stdio.h
int
f(int
sum)
{
if(sum==10)
//第十天時(shí)就剩一個(gè)
return
1;
else
{
sum=sum+1;
return
2*f(sum)+1;
//其他時(shí)候都是倆倍加一
}
}
int
main()
{
printf("%d\n",f(1));
//從第一天開始的
return
0;
}