簡體   English   中英

生成所有具有重復數字的組合

[英]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個堆棧幀,即使遞歸本身僅添加一點信息。

下面概述了一個非常糟糕的解決方案。 它不起作用:

  • 利用n總是一個完美平方的事實。
  • 以非常智能的方式使用內存
  • 釋放它使用的任何內存
  • 甚至無法工作。 ;)

...但這可能會讓您對基本模式有所了解。

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和N,輸出所有長度為M的字符串,它們精確包含N 1s。

您可以將其分解為:

  • 如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM