問題分析思路參考:https://blog.csdn.net/xiao13yu14/article/details/79464582
但是在該博客中,轉化爲排列組合想法很好,但是實現起來不直觀,不簡單。
在本問題中,將問題轉化爲問題:”取m個整數,使其和爲N+m“
這樣轉換後,直接使用遞歸實現即可。遞歸深度爲m。python最大默認遞歸深度爲1000。
1 import numpy as np 2 3 def get_mean_vectors(sum, m): 4 # 取m個數,數的和爲N 5 if m == 1: 6 return [[sum]] 7 vectors = [] 8 for i in range(1, sum - (m - 1) + 1): 9 right_vec = get_mean_vectors(sum - i, m - 1) 10 a = [i] 11 for item in right_vec: 12 vectors.append(a + item) 13 return vectors 14 15 N = 4 # 每個維度上的間隔數。加上邊緣點就是5個點 16 m = 3 # 目標維度 17 18 vectors = get_mean_vectors(N + m, m) 19 vectors = (np.array(vectors) - 1) / N 20 print(len(vectors)) # len = C m-1, N+m-1 21 print(vectors)
結果:
1 15 2 [[0. 0. 1. ] 3 [0. 0.25 0.75] 4 [0. 0.5 0.5 ] 5 [0. 0.75 0.25] 6 [0. 1. 0. ] 7 [0.25 0. 0.75] 8 [0.25 0.25 0.5 ] 9 [0.25 0.5 0.25] 10 [0.25 0.75 0. ] 11 [0.5 0. 0.5 ] 12 [0.5 0.25 0.25] 13 [0.5 0.5 0. ] 14 [0.75 0. 0.25] 15 [0.75 0.25 0. ] 16 [1. 0. 0. ]]
大家對比下上圖樹中結果可知正確。