1. 程式人生 > >使用遞迴函式,輸出n個元素的所有子集

使用遞迴函式,輸出n個元素的所有子集

題目描述:

請編寫一個遞迴函式,用來輸出n個元素的所有子集。例如,三個元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}.

解題思路:

根據子集的定義,集合中的每一個元素在子集中都有兩種狀態:‘1’表示出現,'0'表示不出現;如果所有的元素都不出現,則該子集是空集,如果所有的元素都出現,則該子集是全集。

我們定義一個標記陣列tag,用於記錄集合中對應的元素是否出現,每層遍歷對應集合中的每個元素,都有出現(為‘1’)和不出現(為‘0’)兩種可能,一直遍歷到所有的元素的可能都標記完,然後根據陣列函式輸出結果。

程式程式碼:

#include <iostream>
using namespace std;
void build(char *str,int *tag,int n)
{
	if(n==5)
	{
		cout<<"{";
		for(int i=0;i<5;i++)
			if(tag[i]==1)
				cout<<str[i];
		cout<<"}"<<endl;
		return;
	}
	tag[n] = 0;
	build(str,tag,n+1);
	tag[n] = 1;
	build(str,tag,n+1);
}
int main()
{
	char a[5]={'a','b','c','d','e'};
	int tag[5];
	build(a,tag,0);
	return 0;
}

輸出結果:

{}
{e}
{d}
{de}
{c}
{ce}
{cd}
{cde}
{b}
{be}
{bd}
{bde}
{bc}
{bce}
{bcd}
{bcde}
{a}
{ae}
{ad}
{ade}
{ac}
{ace}
{acd}
{acde}
{ab}
{abe}
{abd}
{abde}
{abc}
{abce}
{abcd}
{abcde}

一共有2^5 = 32個子集。

這是《資料結構與演算法應用》中的一道課後題,看了作者的標準答案:http://www.mhhe.com/engcs/compsci/sahni/c1/E5.HTM

發現和我的思路是一樣的,哈哈,英雄所見略同~

相關推薦

使用函式輸出n元素所有子集

題目描述: 請編寫一個遞迴函式,用來輸出n個元素的所有子集。例如,三個元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}. 解題思路: 根據子集的定義,集合中的每一個元素在子集中都有兩種狀態:‘1’表示出現,'0

通過函式 輸出n元素所有子集

#include <iostream> using namespace std; template <typename T> a為待處理的集合 flag為判斷是否輸出(1輸出 0不輸出) start和end為字面意思 void cout

編寫一個函式用來輸出n 元素所有子集

#include<iostream> using namespace std; int str[]={1,2,3,4,5,6,7}; bool bo[7]; long xnum=0; /* int p

使用函式計算1+2+3+……+n的和

#for迴圈 n = int(input('請輸入一個正整數:')) sum = 0 for i in range(n + 1): sum += i print(sum) #遞迴呼叫 n = int(input('請輸入一個正整數:')) def Sum(n): if n

寫一個函式DigitSum(n輸入一個非負整數返回他組成它的數字之和

寫一個遞迴函式DigitSum(n),輸入一個非負整數,返回他組成它的數字之和 思路分析:遞迴函式的遞推關係:sum%10+DigitSum(sum\10); ​ 出口:sum為個位數; 完整程式: #define _CRT_SECURE_NO_WARNINGS #incl

6-4 求自定型別元素的平均(10 分) 本題要求實現一個函式N集合元素S[]的平均值其中集合元素的型別為自定義的ElementType。

ElementType Average( ElementType S[], int N ){  ElementType ave,sum=0.0;  for(int i=0;i<N;i++)    sum+=S[i];  ave=sum/N;  return ave;}把

python之函式二分查詢

遞迴函式 遞迴函式一直都是我們所覺得難理解的以一種方式,但其實,也很好理解的,遞迴函式就是自己呼叫自己。就是在重複的做同一件事情。只是有的時候,也最好不要使用遞迴函式,因為你的函式一旦呼叫,就要開闢新的記憶體空間。不利於程式的執行。python對你記憶體一個保護機制,預設只能遞迴到998

python實現斐波那契數列 用實現求第N菲波那切數列

斐波那契數列即著名的兔子數列:1、1、2、3、5、8、13、21、34、…… 數列特點:該數列從第三項開始,每個數的值為其前兩個數之和,用python實現起來很簡單: a=0 b=1 while b < 1000: print(b) a, b = b, a+b

函式匿名函式使用注意事項

<1>什麼是遞迴函式 通過前面的學習知道一個函式可以呼叫其他函式。 如果一個函式在內部不呼叫其它的函式,而是自己本身的話,這個函式就是遞迴函式。 <2>遞迴函式的作用 舉個例子,我們來計算階乘 n! = 1 * 2 * 3 * … * n 解決辦法1:

GoLang學習筆記(十五)函式函式內部呼叫自身

遞迴函式,如果一個函式在內部呼叫自身本身,就叫遞迴函式 注意遞迴函式必須滿足以下兩個條件: 1、在每一次呼叫自己時,必須是更接近於解 2、必須要有一個終止處理或計算的準則。 遞迴函式的優點是定義簡單,邏輯清晰。理論上說有遞迴函式都能用迴圈的方式實現,但迴圈不如遞迴清晰。 使用遞迴函式需要注意

python函式(全域性變數區域性變數作用域函式高階函式匿名函式)

  1.1函式 1.1.1什麼是函式 函式就是程式實現模組化的基本單元,一般實現某一功能的集合。函式名:就相當於是程式程式碼集合的名稱引數:就是函式運算時需要參與運算的值被稱作為引數函式體:程式的某個功能,進行一系列的邏輯運算return 返回值:函式的返回值能表示函式的執行結果或

python實現斐波那契數列 用實現求第N菲波那切數列

斐波那契數列即著名的兔子數列:1、1、2、3、5、8、13、21、34、…… 數列特點:該數列從第三項開始,每個數的值為其前兩個數之和,用python實現起來很簡單: a=0 b=1 while b < 1000: print(b) a, b = b

深度優先演算法求含有N元素的集合的全部組合(即:在集合中選123...N元素所有組合不是排列)

先來看一道題:給定整數:a1, a2, a3.....an, 判斷是否可以從中選出任意個數,使其和等於K, (數字的個數,取1--N個數都可以), 這道題要求找出這N個數中選1,2,3...N個元素的所有組合,如果任何一個組合滿足和為K, 就找到了答案,所以:本質上,這道題

輸入一個十進位制整數設計函式將該整數轉化為一個二進位制數。 思考: 如何將一個十進位制數轉化成一個8進位制和16進位制數。

1,輸入一個十進位制整數,設計遞迴函式,將該整數轉化為一個二進位制數。思考: 如何將一個十進位制數轉化成一個8進位制和16進位制數。 #include<stdio.h> #define  N  20 int main() { int a,n,c,k,i; cha

函式匿名函式配合內建函式的使用

一:遞迴函式    函式遞迴呼叫(是一種特殊的巢狀呼叫):在呼叫一個函式的過程中,又直接或間接地呼叫了該函式本身    遞迴必須要有兩個明確的階段:        遞推:一層一層遞迴呼叫下去,強調每進入下一層遞迴問題的規模都必須有所減少        回溯:遞迴必須要有一個明

Go學習筆記(八)範圍(Range)Map(集合)函式型別轉換

Range range 關鍵字用於for迴圈中迭代陣列(array)、切片(slice)、連結串列(channel)或集合(map)的元素。在陣列和切片中它返回元素的索引值,在集合中返回 key-value 對的 key 值。 package main

HTML中的函式使用基礎(函式定義函式呼叫函式引數函式返回值巢狀函式函式變數作用域內建函式其他定義函式的方法)

HTML中的函式使用基礎 函式實質上是一個類似於單獨的邏輯單元的JavaScript程式碼,使用函式可以使程式碼更為簡潔,提供重用性,在JavaScript中,大約有95以上的程式碼是包含在函式中的,由此可見,函式在JavaScript中地位相當重要。 1、函式定義 在

C語言與非實現求第n斐波那契數

一、非遞迴實現第N個菲波那切數列: 程式如下: #include <stdio.h> int fib(int n) { int a1 = 1; int a2 = 1; int a3

m元素的集合取n元素子集

{        privateint m;        privateint[] set;        privateboolean first;        privateint position;             public NofM(int n, int m)     ...{    

輸入一個集合輸出這個集合的所有子集

package cn.edu.bupt.sherry; import java.util.ArrayList; import java.util.Scanner; public class Test