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