กำหนดจำนวนเต็มบวก n เราต้องพิมพ์ชุดย่อยทั้งหมดของชุด {1, 2, 3, 4,... n} โดยไม่ต้องใช้อาร์เรย์หรือลูปใดๆ
เช่นเดียวกับที่เราให้ตัวเลขใดๆ ที่บอกว่า 3 วินาที เราต้องพิมพ์เซตย่อยทั้งหมดในเซต {1, 2, 3} ซึ่งจะเป็น {1 2 3}, {1 2}, {2 3}, {1 3}, {1}, {2}, {3} { }.
แต่เราต้องทำสิ่งนี้โดยไม่ใช้ลูปหรืออาร์เรย์ใดๆ ดังนั้น การเรียกซ้ำเท่านั้นจึงเป็นวิธีที่เป็นไปได้ในการแก้ปัญหาประเภทนี้โดยไม่ต้องใช้อาร์เรย์หรือลูป
ตัวอย่าง
Input: 3
Output: { 1 2 3 }{ 1 2 }{ 1 3 }{ 1 }{ 2 3 }{ 2 }{ 3 }{ }
Explanation: The set will be {1 2 3} from which we will find the subsets
Input: 4
Output: { 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 }{ } แนวทางที่เราจะใช้ในการแก้ปัญหาที่กำหนด −
- เริ่มจาก num =2^n -1 ไม่เกิน 0
- พิจารณาการแทนค่าไบนารีของ num ด้วยจำนวนบิต n
- เริ่มจากบิตซ้ายสุดซึ่งแทน 1 บิตที่สองแทน 2 และไปเรื่อยๆ จนถึงบิตที่ n ซึ่งแทน n
- พิมพ์ตัวเลขที่ตรงกับบิตหากมีการตั้งค่าไว้
- ทำตามขั้นตอนข้างต้นสำหรับค่า num ทั้งหมดจนกว่าจะเท่ากับ 0
มาทำความเข้าใจวิธีการที่ระบุไว้โดยละเอียดว่ามันทำงานอย่างไรโดยใช้ตัวอย่างง่ายๆ −
สมมติว่าอินพุต n =3 ดังนั้นปัญหาเริ่มต้นจาก num =2^3 - 1 =7
- การแทนไบนารีของ 7 ⇒
| 1 | 1 | 1 |
- ส่วนย่อยที่สอดคล้องกัน ⇒
| 1 | 2 | 3 |
ลบ 1 จาก num; num =6
- การแทนแบบไบนารีของ 6 ⇒
| 1 | 1 | 0 |
- ส่วนย่อยที่สอดคล้องกัน ⇒
| 1 | 2 | |
ลบ 1 จาก num; num =5
- การแทนไบนารีของ 5 ⇒
| 1 | 0 | 1 |
- ส่วนย่อยที่สอดคล้องกัน ⇒
| 1 | | 3 |
ลบ 1 จาก num; num =4
- การแทนไบนารีของ 4 ⇒
| 1 | 0 | 0 |
- ส่วนย่อยที่สอดคล้องกัน ⇒
| 1 | | |
ในทำนองเดียวกัน เราจะวนซ้ำจนถึง num =0 และพิมพ์ชุดย่อยทั้งหมด
อัลกอริทึม
Start
Step 1 → In function int subset(int bitn, int num, int num_of_bits)
If bitn >= 0
If (num & (1 << bitn)) != 0
Print num_of_bits - bitn
subset(bitn - 1, num, num_of_bits);
Else
Return 0
Return 1
Step 2 → In function int printSubSets(int num_of_bits, int num)
If (num >= 0)
Print "{ "
Call function subset(num_of_bits - 1, num, num_of_bits)
Print "}"
Call function printSubSets(num_of_bits, num - 1)
Else
Return 0
Return 1
Step 3 → In function int main()
Declare and initialize int n = 4
Call fucntionprintSubSets(n, (int) (pow(2, n)) -1)
Stop ตัวอย่าง
#include <stdio.h>
#include <math.h>
// This function recursively prints the
// subset corresponding to the binary
// representation of num.
int subset(int bitn, int num, int num_of_bits) {
if (bitn >= 0) {
// Print number in given subset only
// if the bit corresponding to it
// is set in num.
if ((num & (1 << bitn)) != 0) {
printf("%d ", num_of_bits - bitn);
}
// Check the next bit
subset(bitn - 1, num, num_of_bits);
}
else
return 0;
return 1;
}
//function to print the subsets
int printSubSets(int num_of_bits, int num) {
if (num >= 0) {
printf("{ ");
// Printint the subsets corresponding to
// the binary representation of num.
subset(num_of_bits - 1, num, num_of_bits);
printf("}");
// recursively calling the function to
// print the next subset.
printSubSets(num_of_bits, num - 1);
}
else
return 0;
return 1;
}
//main program
int main() {
int n = 4;
printSubSets(n, (int) (pow(2, n)) -1);
} ผลลัพธ์
{ 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 }{ }