Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C प्रोग्राम: सरणी या लूप के बिना {1,2,3,...n} के सभी उपसमुच्चय प्रिंट करना

समस्या विवरण

एक धनात्मक पूर्णांक n दिया गया है, सेट {1, 2, 3, ..., n} के सभी उपसमुच्चय प्रिंट करें किसी सरणी या लूप का उपयोग किए बिना। केवल रिकर्सन अनुमत है।

उदाहरण

इनपुट: 3
आउटपुट: { 1 2 3 } { 1 2 } { 1 3 } { 1 } { 2 3 } { 2 } { 3 } { }
इनपुट: 4
आउटपुट: { 1 2 3 4 } { 1 2 3 } { 1 2 4 } { 1 2 } { 1 3 4 } { 1 3 } { 1 4 } { 1 } { 2 3 4 } { 2 3 } { 2 4 } { 2 } { 3 4 } { 3 } { 4 } { }

बिटमास्क दृष्टिकोण (रिकर्सिव)

कुल उपसमुच्चय = 2ⁿ। प्रत्येक उपसमुच्चय एक बिटमास्क (0 से 2ⁿ-1) से मेल खाता है।

n=3 के लिए:

संख्याबाइनरीउपसमुच्चय
7111{1,2,3}
6110{1,2}
5101{1,3}
4100{1}
3011{2,3}
2010{2}
1001{3}
0000{}

C प्रोग्राम (केवल रिकर्सन)

#include <stdio.h>
#include <math.h>

// एक विशिष्ट बिटमास्क के लिए उपसमुच्चय प्रिंट करें
void print_subset(int bit, int num, int n) {
    if (bit >= 0) {
        if (num & (1 << bit))
            printf("%d ", n - bit);
        print_subset(bit - 1, num, n);
    }
}

// सभी उपसमुच्चय प्रिंट करें
void print_subsets(int n, int num) {
    if (num >= 0) {
        printf("{ ");
        print_subset(n - 1, num, n);
        printf("} ");
        print_subsets(n, num - 1);
    }
}

int main() {
    int n;
    printf("n दर्ज करें (1-10): ");
    scanf("%d", &n);
    
    if (n < 1 || n > 10) {
        printf("सीमा 1-10\n");
        return 1;
    }
    
    int total = (int)pow(2, n) - 1;
    print_subsets(n, total);
    printf("\n");
    return 0;
}

नमूना आउटपुट

n दर्ज करें: 3
{ 1 2 3 } { 1 2 } { 1 3 } { 1 } { 2 3 } { 2 } { 3 } { } 

कैसे काम करता है

  1. print_subsets(n, 2ⁿ-1) से शुरू होता है
  2. प्रत्येक कॉल के लिए:
    • "{ " प्रिंट करता है
    • print_subset को बिट्स जांचने के लिए कॉल करता है
    • "} " प्रिंट करता है
    • अगली छोटी संख्या के लिए रिकर्स करता है
  3. बेस केस: जब num < 0 हो तो रुकें

जटिलता

  • समय: O(n × 2ⁿ) - प्रत्येक उपसमुच्चय के लिए n बिट्स जांचता है
  • स्थान: O(n) - रिकर्सन स्टैक गहराई
  • कुल उपसमुच्चय: 2ⁿ

विकल्प: बैकट्रैकिंग दृष्टिकोण

void backtrack(int idx, int n, int *current, int len) {
    if (idx > n) {
        printf("{ ");
        for (int i = 0; i < len; i++) printf("%d ", current[i]);
        printf("} ");
        return;
    }
    // शामिल करें
    current[len] = idx;
    backtrack(idx + 1, n, current, len + 1);
    // बाहर करें
    backtrack(idx + 1, n, current, len);
}

// कॉल: int arr[10]; backtrack(1, n, arr, 0);
  1. C प्रोग्राम: रिकर्सन का उपयोग करके जांचें कि सरणी पैलिंड्रोम है या नहीं C प्रोग्राम: रिकर्सन का उपयोग करके जांचें कि सरणी पैलिंड्रोम है या नहीं

    पैलिंड्रोम सरणी एक सरणी पैलिंड्रोम होती है यदि यह आगे और पीछे से समान पढ़ी जाए। उदाहरण: {1, 2, 3, 2, 1} ✓, {1, 0, 0, 1} ✓, {1, 2, 3, 4} ✗ रिकर्सिव दृष्टिकोण आधार मामला: यदि = end → पैलिंड्रोम (true) जांच: यदि arr[start] != arr[end] → पैलिंड्रोम नहीं (false) रिकर्सन: start+1 और end-1 के साथ कॉल करे

  1. पायथन प्रोग्राम: बिना किसी लूप के नंबर सीरीज़ प्रिंट करें पायथन प्रोग्राम: बिना किसी लूप के नंबर सीरीज़ प्रिंट करें

    इस लेख में, हम नीचे दिए गए प्रॉब्लम स्टेटमेंट के समाधान के बारे में सीखेंगे: प्रॉब्लम स्टेटमेंट दो संख्याएं N और K दी गई हैं, हमारी समस्या है N से K घटाते रहना जब तक N शून्य से बड़ा है, एक बार N नेगेटिव या शून्य हो जाए तो हम इसमें K जोड़ना शुरू करते हैं जब तक वह संख्या मूल संख्या N नहीं बन जाती। उ

  1. पायथन प्रोग्राम: बिना किसी लूप के संख्या श्रृंखला प्रिंट करें पायथन प्रोग्राम: बिना किसी लूप के संख्या श्रृंखला प्रिंट करें

    इस लेख में, हम नीचे दिए गए समस्या कथन के समाधान के बारे में जानेंगे -समस्या कथन - दो संख्याएं N और K दी गई हैं, हमारी समस्या है कि N से K को तब तक घटाएं जब तक N शून्य (0) से बड़ा है, एक बार N ऋणात्मक या शून्य हो जाए तो हम इसमें K जोड़ना शुरू करते हैं जब तक कि वह संख्या मूल संख्या (N) न बन जाए।उदाहरण