看到這個命題首先想到的是暴力遞迴,除了這個辦法看起來好像沒有更好的辦法。。。不知道是不是。
舉個栗子:比如 4
首先想到的是1+1+1+1,來抽象一下,數字n,它的所有組合情況一定是這樣的:
1+f(n-1)
2+f(n-2)
3+f(n-3)
n-1+f(1)
哈哈,有沒有看到一絲規律呢,其實遞迴退出條件都被你看到了。
再往下寫乙個 f(n-1) = 1+f(n-1-1)
哈哈哈,彷彿看到了亮閃閃的for迴圈,你說對了,每次遞迴初始值都是從1開始的,終止條件呢,當然是本層棧待求變數的最大值嘍,是這樣嗎?
實踐一下就知道了
#include #include #include using namespace std;
#define min(x,y) (((x)<(y))?(x):(y))
void writebuffer(const int * buffer)
printf("%d\n", *buffer);
}void _splitnum(int * buffer, const int x, const size_t pos)
else }
}void splitnum(const int x)
}int main()
4
1+1+1+1
1+1+2
1+2+1
1+32+1+1
2+23+1
我們發現有重複的組合,觀察一下重複序列的特點,1+1+2 、 2+1+1 什麼區別,乙個序列後面的值大於前面的值唄,另乙個後面的值,都小於第乙個值唄,推廣一下,還都符合規律,像乙個什麼辦法控制一下呢,將 x 的值控制成序列前面所有值的最小值不就行了嗎,min(x,buffer[pos]),完美解決重複的問題
#include #include #include using namespace std;
#define min(x,y) (((x)<(y))?(x):(y))
void writebuffer(const int * buffer)
printf("%d\n", *buffer);
}void _splitnum(int * buffer, const int x, const size_t pos)
else }
}void splitnum(const int x)
}int main()
4
1+1+1+1
2+1+1
2+23+1
讀者細細把玩一下吧,遞迴還是很有趣的。
將乙個偶數分解成質數之和
目標 將乙個偶數,分解成質數之和。public class disintegrateevennumber 判斷乙個正整數是否是質數 public static boolean isprimenum int inputnum else return result 判斷是否是乙個偶數 public st...
將乙個數m分解成n個數之和的所有可能
週末的時候,師兄提了乙個小學生的題目,然後這個題目自我估計,反正我是做不出來的。然後師兄想用計算機的方法,寫個 看能不能把這個問題解答出來,於是就找了一下我這個菜雞一起討論 題目就不貼了,樓主感覺小學生過的好難啊 最後師兄表示他在乙個問題上卡住了,簡化之後問題是這樣的 有n個數,他們之和為m,這些組...
將乙個整數 M 分解成 K 個數之和的方法數
記錄乙個遇見的問題,關於將乙個整數 m 分解成 k 個數之和 1,首先 k 個數不能有 0 如果有 0 也很簡單啊,將問題進一步分解成 將整數 m 分解成 k 1 個數之和 以此類推一直到分解成 1 個數之和,所有相加就可以得出數量 2,對於順序顛倒不算,比如將 3 分解成 2 個數之和,可以分成 ...