我正在尋找所有的組合,nC r :
#include <stdio.h>
void make_combination( int n, int r ) {
for (int x=1; x< n-r 1 1; x ){
//因為它是從1開始的,所以也要在范圍內加1。
for (int y=x 1; y< n-r y 1; y ){
for (int z=y 1; z<n-r z 1; z ){
printf("%d %d %d
",x,y,z)。
}
}
}
}
int main(void){
int n, r;
printf("insert n : ")。
scanf("%d", &n) 。
printf("Insert r : ") 。
scanf("%d"/span>, &r)。
make_combination(n, r)。
return 0;
}
我想把它變成遞回函式。
以使它對變數'r'值起作用。
因為我不希望有固定數量的for回圈。
我試過了,但無法制作遞回函式。
uj5u.com熱心網友回復:
的確,我們可以使用遞回來構建嵌套的n級深度結構的for回圈,在遞回的最深層執行行動。
或者,等價地,我們可以建立n-1層,并明確地執行最后的for回圈,像這樣:
#include <stdio.h>/span>
void rec(const char *pre。int n, int lo, int hi) {
if (n == 0) return;
if (n > 1) {
for (int k = lo; k <= hi; k ) {
char tmp[100]; //100足夠家庭使用。
sprintf(tmp, "%s %d"/span>, pre, k);
rec(tmp, n - 1, k 1, hi) 。
}
} else {
for (int k = lo; k <= hi; k ) printf("%s %d
", pre, k)。)
}
}
int main(void) {
rec("", 3, 0, 5); //使用0至5的3個值。
return 0。
}
這將創建0...5范圍內的數字的排序三聯體。輸出
0 1 2 0 1 3 0 1 4 0 1 5 0 2 3 0 2 4 0 2 5 0 3 4 0 3 5 0 4 5 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5
用rec("", 4, 0, 5);替換main中的呼叫,創建了4個元組;輸出結果是
0 1 2 3 0 1 2 4 0 1 2 5 0 1 3 4 0 1 3 5 0 1 4 5 0 2 3 4 0 2 3 5 0 2 4 5 0 3 4 5 1 2 3 4 1 2 3 5 1 2 4 5 1 3 4 5 2 3 4 5
添加了我寫遞回函式的思考程序
我知道遞回解決方案的基礎是"降低復雜性和遞回"。所以我想 "解決"n回圈,當我知道如何做n-1回圈的時候。
我如何做0回圈?簡單(但沒有幫助):什么都不做
if (n == 0) return;
我如何做1回圈?只要列印數字即可
if (n == 1) for (int k = lo; k <= hi; k ) printf("%d", k) 。
如何進行n回圈?對于每一個可用的數字,保存該數字并以1少的回圈和調整的限制進行遞回。
正是這樣才產生了那段代碼。在寫完代碼后,我本可以認真研究它,并在某些方面進行精簡,但我決定按原樣發布。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/306949.html
標籤:
