考慮一個函式,它接受任何整數,并回傳一些東西,其性質可能是什么。我把這樣一個函式可以回傳的值集稱為它的回傳集。
我想要一種方法來從兩個這樣的函式中生成一個新的這樣的函式,其中的回傳集是兩個已經存在的函式的回傳集的交集。
讓我舉個例子。假設這兩個功能是
int DivisibleByTwo(int i)
{
return 2 * i;
}
int DivisibleByThree(int i)
{
return 3 * i;
}
第一個函式的回傳集顯然是所有能被 2 整除的整數,而第二個函式的回傳集顯然是所有能被 3 整除的整數(假設我們不必擔心諸如最大整數大小之類的事情)。我想找到的函式的回傳集當然是所有可以被二和三整除的整數。實作這一點的一種可能方法是
int DivisibleByTwoAndThree(int i)
{
return 2 * 3 * i;
}
現在我可以在腦海中輕松找到該功能。但我想要的是一個自動執行此操作的程式。這就是我卡住的地方,我似乎無法想出一個演算法來做到這一點,感覺或多或少是不可能的。所以我在問,我在處理一些實際上不可能的事情嗎?如果沒有,我將如何處理它?
uj5u.com熱心網友回復:
這是非負整數的 Python 解決方案。它的效率是..可怕的。事實上,如果兩個輸出的交集是有限的,它可以永遠運行而不回傳答案。如果任一輸入功能卡住,同上。
def natural_pairs ():
yield (0, 0)
i = 0
while True:
i = i 1
j = 0
while j <= i:
yield (i, j)
yield (j, i)
j = j 1
def intersect_functions (f, g):
def intersected (n):
for i, j in natural_pairs():
if f(i) == g(j):
n -= 1
if n < 0:
return f(i)
return intersected
def times2 (n):
return 2*n
def times3(n):
return 3*n
combined = intersect_functions(times2, times3)
for i in range(10):
print(i, combined(i))
我相信康托爾會感到自豪。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505890.html
標籤:算法
上一篇:求陣列中k對的絕對差的最小和