Problem:
【题目】 请把一段纸条竖着放在桌子上,然后从纸条的下边向
上方对折1次,压出折痕后展开。此时 折痕是凹下去的,即折痕
突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折
2 次,压出折痕后展开,此时有三条折痕,从上到下依次是下折
痕、下折痕和上折痕。
给定一 个输入参数N,代表纸条都从下边向上方连续对折N次,
请从上到下打印所有折痕的方向。 例如:N = 1时,打印: down
N = 2时,打印: down down up
Solution:
首先,计算折痕次数是很好算的,一共是2^0 + 2^1 + ...+ 2^N
上下折痕次数也很好算,第一次是下折痕,然后上下折横次数平分总折横次数,下折痕多一次
但是不知道怎么使用递归
但是找到规律了,就是在上一次折痕的间隙依次插入下、上n次
比如:
第2次折痕为: 下 下 上
第3次折痕为 下 上 下 上
即: 下 下 上 下 下 上 上
Code:
1 #pragma once
2 #include <iostream>
3 #include <vector>
4 #include <string>
5
6 using namespace std;
7
8 struct Node
9 {
10 string str;
11 Node* next;
12 Node(string s = "") :str(s), next(NULL) {}
13 };
14
15
16 Node* ZheZhi01(const int N)//非递归方式,使用链表插入更方便
17 {
18 Node* head = new Node("");
19 Node* p;
20 for (int i = 1; i <= N; ++i)
21 {
22 p = head;
23 if (i == 1)//第一次折横
24 {
25 Node* q = new Node("down");
26 q->next = p->next;
27 p->next = q;
28 p = p->next->next;
29 }
30 while(p)
31 {
32 Node* q1 = new Node("down");
33 q1->next = p->next;
34 p->next = q1;
35 p = p->next->next;
36
37 Node* q2 = new Node("up");
38 q2->next = p->next;
39 p->next = q2;
40 p = p->next->next;
41 }
42
43 }
44 return head;
45 }
46
47 void ZheZhi02(const int N, int i, bool down)//使用递归方式
48 {
49 if (i > N)
50 return;
51 ZheZhi02(N, i + 1, true);
52 if (down)
53 cout << "down" << '\t';
54 else
55 cout << "up" << '\t';
56 ZheZhi02(N, i + 1, false);
57 }
58
59
60 void Test()
61 {
62 int N;
63 cout << "请输入折纸次数 N: ";
64 cin >> N;
65
66 ZheZhi02(N, 1, true);
67
68
69 Node* head = NULL;
70 head = ZheZhi01(N);
71 Node* p = head->next;
72 cout << "折纸痕为:" << endl;
73 while (p)
74 {
75 cout << p->str << "\t";
76 p = p->next;
77 }
78 cout << endl;
79
80 }
来源:https://www.cnblogs.com/zzw1024/p/11007479.html