[英]Generating all combinations with repeating digits
我已經在這個網站上閱讀了足夠長的時間,以至於不掩飾這是一項家庭作業。 但是我正在嘗試編寫一個代碼,該代碼可以生成僅0和1的字符串的所有可能組合。 如果字符串的長度為n ^ 2,則將有n個1,其余為0。 長度始終是完美的正方形。 我正在用C進行編碼,並且我一直試圖在嵌套循環中執行此操作,但似乎可以以遞歸的方式更輕松地完成它,但我不確定如何進行設置。 任何提示或建議,將不勝感激。
偽代碼:
myfun(pos,length, ones)
if (length==0)
pos='\0'
#print, collect, whatever...
return
if (length>ones)
pos='0'
myfun(pos+1,length-1, ones)
pos='1'
myfun(pos+1, length-1, ones-1)
task(n)
#allocate n^2 buffer
myfun(buffer, n*n, n)
我不確定這個問題是否會導致遞歸。 在C語言(和大多數語言)中,每次調用函數時,都會創建一個堆棧框架,並使用一些處理器周期和大量的堆棧內存。 任何針對此問題的遞歸解決方案都將創建n ^ 2個堆棧幀,即使遞歸本身僅添加一點信息。
下面概述了一個非常糟糕的解決方案。 它不起作用:
...但這可能會讓您對基本模式有所了解。
void foo(int zeros_left, int length_left, char *s)
{
if (length_left == 0)
printf("%s\n", s);
else
{
if (zeros_left > 0)
{
char *next = malloc(strlen(s) + 2);
strcpy(next, s);
strcat(next, "0");
foo(zeros_left - 1, length_left - 1, next);
}
if (zeros_left != length_left)
{
char *next = malloc(strlen(s) + 2);
strcpy(next, s);
strcat(next, "1");
foo(zeros_left, length_left - 1, next);
}
}
}
遞歸建模問題的關鍵是將較大版本的問題分解為簡單的計算,再將較小版本的問題合並在一起,並用平凡的情況終止遞歸。
在這種情況下,問題是:
您可以將其分解為:
M = 0
,則輸出一個空字符串; 除此以外 M-1
字符串,這些字符串恰好包含N
1個,並在每個字符串前加上0; 和 N > 0
,則輸出長度為M-1
所有字符串,其中包含正好為N-1
1的所有字符串,並為每個字符串加1。 在這里, M = 0
是終止遞歸的平凡情況。 將以上內容轉換為代碼相當簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.