① 用C語言求解:採用遞歸法求10!,並繪製程序流程圖
遞歸演算法,主要要知道遞歸出口在哪裡,
當問題出現循環嵌套,感覺一直套不玩的那種題一般就用上遞歸演算法了,
想階乘不一定要用遞歸,用遞歸出口也更好找,出口股市變數減到1
首先輸入一個數n,
定義一個存儲結果的s=1;
判斷數n是不是1,不是就進行循環運算,
S=n*(n-1);
N--;
② 簡單遞歸流程圖怎麼畫
入口 -------》 遞歸調用
| |
—————(檢驗)------》出口
③ 遞歸演算法流程圖如何畫請以菲波那切數列遞歸演算法為例
遞歸(recursion):程序調用自身的編程技巧。
遞歸滿足2個條件:
1)有反復執行的過程(調用自身)
2)有跳出反復執行過程的條件(遞歸出口)
遞歸例子:
(1)階乘
n! = n * (n-1) * (n-2) * ...* 1(n>0)
//階乘
int recursive(int i)
{
int sum = 0;
if (0 == i)
return (1);
else
sum = i * recursive(i-1);
return sum;
}
(2)河內塔問題
//河內塔
void hanoi(int n,int p1,int p2,int p3)
{
if(1==n)
cout<<"盤子從"<<p1<<"移到"<<p3<<endl;
else
{
hanoi(n-1,p1,p3,p2);
cout<<"盤子從"<<p1<<"移到"<<p3<<endl;
hanoi(n-1,p2,p1,p3);
}
}
(3)全排列
從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的一個排列。當m=n時所有的排列情況叫全排列。
如1,2,3三個元素的全排列為:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
//全排列
inline void Swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
void Perm(int list[],int k,int m)
{
if (k == m-1)
{
for(int i=0;i<m;i++)
{
printf("%d",list[i]);
}
printf("n");
}
else
{
for(int i=k;i<m;i++)
{
Swap(list[k],list[i]);
Perm(list,k+1,m);
Swap(list[k],list[i]);
}
}
}
④ java中遞歸演算法是什麼怎麼算的
一、遞歸演算法基本思路:
Java遞歸演算法是基於Java語言實現的遞歸演算法。遞歸演算法是一種直接或者間接調用自身函數或者方法的演算法。遞歸演算法實質是把問題分解成規模縮小的同類問題的子問題,然後遞歸調用方法表示問題的解。遞歸往往能給我們帶來非常簡潔非常直觀的代碼形式,從而使我們的編碼大大簡化,然而遞歸的思維確實跟我們的常規思維相逆的,通常都是從上而下的思維問題,而遞歸趨勢從下往上的進行思維。
二、遞歸演算法解決問題的特點:
【1】遞歸就是方法里調用自身。
【2】在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
【3】遞歸演算法代碼顯得很簡潔,但遞歸演算法解題的運行效率較低。所以不提倡用遞歸設計程序。
【4】在遞歸調用的過程中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等,所以一般不提倡用遞歸演算法設計程序。
【5】在做遞歸演算法的時候,一定把握出口,也就是做遞歸演算法必須要有一個明確的遞歸結束條件。這一點是非常重要的。其實這個出口就是一個條件,當滿足了這個條件的時候我們就不再遞歸了。
三、代碼示例:
publicclassFactorial{
//thisisarecursivefunction
intfact(intn){
if(n==1)return1;
returnfact(n-1)*n;
}}
publicclassTestFactorial{publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Factorialfactorial=newFactorial();
System.out.println("factorial(5)="+factorial.fact(5));
}
}
代碼執行流程圖如下:
此程序中n=5就是程序的出口。
⑤ 遞歸演算法的流程圖怎麼畫
和普通函數的流程圖沒什麼區別,就是在調用遞歸的時候做一個分支出來指向函數開始位置即可