生活随笔
收集整理的這篇文章主要介紹了
递归练习题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 問題 A: 吃糖果
- 問題 B: 數列
- 問題 C: 神奇的口袋【★★】
- 問題 D: 八皇后 【★★】
問題 A: 吃糖果
http://codeup.cn/problem.php?cid=100000583&pid=0
樣例輸入
1
2
4
樣例輸出
1
2
5
#include<cstdio>
int F(int n
)
{if(n
==1||n
==2)return 1;elsereturn F(n
-1)+F(n
-2);
}
int main(void)
{int n
;while( scanf("%d",&n
) != EOF ){printf("%d\n",F(n
+1));}return 0;
}
問題 B: 數列
http://codeup.cn/problem.php?cid=100000583&pid=1
#include<cstdio>
int F(int n
)
{if(n
==1||n
==2)return 1;elsereturn F(n
-1)+F(n
-2);
}
int main(void)
{int n
,m
;scanf("%d",&m
);int i
,j
,k
;int w
;for(i
=0;i
<m
;i
++){scanf("%d",&n
);w
=1;for(j
=1;j
<=n
;j
++){for(k
=1;k
<n
-j
+1;k
++){printf(" ");} if(n
==1){printf("0\n");break;}printf("0 ");for(k
=1;k
<w
;k
++){printf("%d ",F(k
));}w
=w
+2;printf("\n"); }}return 0;
}
問題 C: 神奇的口袋【★★】
http://codeup.cn/problem.php?cid=100000583&pid=2
題目分析:
本題用到了遞歸和回溯。
遞歸一定要找到兩個條件:
①遞歸邊界。
②遞歸式(或稱遞歸調用)。
遞歸邊界
本題的遞歸邊界很明顯 當重量到達40就停止遞歸。
if(weight==40)return;
遞歸式
首先函數有三個參數分別為 int weight 、 int a[] 、int p
weight表示當前的重量 a[]是你要遍歷的數組 p是下一個選擇的物體的編號。
遞推式為: F(weight,a,p)=F(weight+a[i],a,p+1);
回溯
if(weight
>40)
{weight
=weight
-a
[i
];
}
總的代碼如下:
#include<cstdio>
int count
=0;
void F(int weight
,int a
[],int p
)
{if(weight
==40){count
++;return;}for(int i
=p
;a
[i
]!=0;i
++){weight
+=a
[i
];if(weight
<=40){F(weight
,a
,i
+1);}weight
-=a
[i
];}
}
int main(void)
{int n
,i
;while(scanf("%d",&n
)!=EOF){ int a
[100]={0};count
=0;for(i
=0;i
<n
;i
++){scanf("%d",&a
[i
]);}F(0,a
,0);printf("%d\n",count
);}return 0;
}
問題 D: 八皇后 【★★】
http://codeup.cn/problem.php?cid=100000583&pid=3
#include<cstdio>
#include<cmath>
const int maxn
=11;
int n
;
int count
=1;
int p
[maxn
];
int a
[100];
int hashTable
[maxn
]={false};
void generateP(int index
)
{if(index
==n
+1){bool flag
=true;for(int i
=1;i
<=n
;i
++){for(int j
=i
+1;j
<=n
;j
++){if(abs(i
-j
)==abs(p
[i
]-p
[j
])){flag
=false;}}}if(flag
){int sum
=0;for(int i
=1;i
<=8;i
++){sum
=sum
*10+p
[i
];}a
[count
]=sum
;count
++;}return ;}for(int x
=1;x
<=n
;x
++){if(hashTable
[x
]==false){p
[index
]=x
;hashTable
[x
]=true;generateP(index
+1);hashTable
[x
]=false;}}
}
int main(void)
{n
=8;generateP(1);int N
,b
;scanf("%d",&N
);for(int i
=1;i
<=N
;i
++){scanf("%d",&b
);printf("%d\n",a
[b
]);}return 0;
}
《新程序員》:云原生和全面數字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的递归练习题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。