遞歸c語言組合
『壹』 求問c語言題目:排列組合(最好使用遞歸)
#include <stdio.h>
void swap(int &a,int &b)
{int c;
c=a; a=b; b=c;
}
void perm (int*list,int i,int n)
{
int j;
if(i==n)
{
for(j=0;j<=n;j++)
printf("%d",list[j]);
printf("\t");
}
else
{
for(j=i;j<=n;j++)
{
swap(list[i],list[j]);
perm(list,i+1,n);
swap(list[i],list[j]);
}
}
}
int main()
{int n;
int list[10]={1,2,3,4,5,6,7,8,9,0};
scanf("%d",&n);
perm(list,0,n-1);
return 0;
}
『貳』 c語言 用遞歸函數求組合數並使輸出結果為comb(2,1)=2的形式
#include<stdio.h>
intcomb(intn,intm)
{
if(m==1)returnn;
if(n==m||m==0)return1;
returncomb(n-1,m-1)+comb(n-1,m);
}
int液枝main()
{
printf("%d ",comb(2,1));
return升埋和吵盯0;
}
『叄』 C語言中的遞歸是什麼意思
程序調用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種演算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解。
遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。
一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。
(3)遞歸c語言組合擴展閱讀:
遞歸的應用
1、數據的定義是按遞歸定義的。(Fibonacci函數)
2、問題解法按遞歸演算法實現。這類問題雖則本身沒有明顯的遞歸結構,但用遞歸求解比迭代求解更簡單,如Hanoi問題。
3、數據的結構形式是按遞歸定義的。
遞歸的缺點
遞歸演算法解題相對常用的演算法如普通循環等,運行效率較低。因此,應該盡量避免使用遞歸,除非沒有更好的演算法或者某種特定情況,遞歸更為適合的時候。在遞歸調用的過程當中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等。
『肆』 C語言中如何用遞歸的方法求從n個數中取m個數的排列組合的所有情況,其中n<m,要求寫出完整的程序
典型的組合問題,解法有遞歸、回溯等等
遞歸法較簡單,代碼如下:
void combine(int a[], int n, int m, int b[], int M);
參數:
a 存放候選數字
n 總項數
m 取出項數
b 存放選出結果
M = m
#include"stdio.h"
#defineMAX100
voidcombine(inta[],intn,intm,intb[],intM);
intmain(void)
{
inti;
inta[MAX],b[MAX];
for(i=1;i<100;i++)
a[i-1]=i;
combine(a,5,4,b,4);
}
voidcombine(inta[],intn,intm,intb[],intM)
{
inti,j;
for(i=n;i>=m;i--)
{
b[m-1]=i-1;
if(m>1)
combine(a,i-1,m-1,b,M);
else
{
for(j=M-1;j>=0;j--)
printf("%d",a[b[j]]);
printf(" ");
}
}
}
其他方法可查閱相關資料。