44 递归的思想与应用(中)
原文:https://www.cnblogs.com/wanmeishenghuo/p/9678143.html参考狄泰软件相关教程


将大问题分解,先将第一个节点拿出来,将其它的节点看成一个整体。
#include <iostream>
#include <cstring>
#include "DTString.h"
using namespace std;
using namespace DTLib;
struct Node
{
int value;
Node* next;
};
Node* create_list(int v, int len) // v:数据元素从哪一个之开始。 len:长度
{
Node* ret = NULL;
Node* slider = NULL;
for(int i=0; i<len; i++)
{
Node* n = new Node();
n->value = v++;
n->next = NULL;
if( slider == NULL )
{
slider = n;
ret = n;
}
else
{
slider->next = n;
slider = n;
}
}
return ret;
}
void destroy_list(Node* list)
{
while( list )
{
Node* del = list;
list = list->next;
delete del;
}
}
void print_list(Node* list)
{
while( list )
{
cout << list->value << "->";
list = list->next;
}
cout << "NULL" << endl;
}
Node* reverse(Node* list)
{
if( (list == NULL) || (list->next == NULL) )
{
return list;
}
else
{
Node* guard = list->next;
Node* ret = reverse(list->next);
guard->next = list;
list->next = NULL;
return ret;
}
}
int main()
{
Node* list = create_list(1, 5);
print_list(list);
list = reverse(list);
print_list(list);
destroy_list(list);
return 0;
}

实验2:


#include <iostream>
#include <cstring>
#include "DTString.h"
using namespace std;
using namespace DTLib;
struct Node
{
int value;
Node* next;
};
Node* create_list(int v, int len) // v:数据元素从哪一个之开始。 len:长度
{
Node* ret = NULL;
Node* slider = NULL;
for(int i=0; i<len; i++)
{
Node* n = new Node();
n->value = v++;
n->next = NULL;
if( slider == NULL )
{
slider = n;
ret = n;
}
else
{
slider->next = n;
slider = n;
}
}
return ret;
}
void destroy_list(Node* list)
{
while( list )
{
Node* del = list;
list = list->next;
delete del;
}
}
void print_list(Node* list)
{
while( list )
{
cout << list->value << "->";
list = list->next;
}
cout << "NULL" << endl;
}
Node* reverse(Node* list)
{
if( (list == NULL) || (list->next == NULL) )
{
return list;
}
else
{
Node* guard = list->next;
Node* ret = reverse(list->next);
guard->next = list;
list->next = NULL;
return ret;
}
}
Node* merge(Node* list1, Node* list2)
{
if( list1 == NULL )
{
return list2;
}
else if( list2 == NULL )
{
return list1;
}
else if( list1->value < list2->value )
{
/*
Node* list1_ = list1->next;
Node* list = merge(list1_, list2);
list1->next = list;
return list1;
*/
return (list1->next = merge(list1->next, list2), list1); //逗号表达式
}
else
{
/*
Node* list2_ = list2->next;
Node* list = merge(list1, list2_);
list2->next = list;
return list2;
*/
return (list2->next = merge(list2->next, list1), list2); //逗号表达式
}
}
int main()
{
Node* list1 = create_list(1, 5);
Node* list2 = create_list(2, 6);
print_list(list1);
print_list(list2);
Node* list = merge(list1, list2);
print_list(list);
destroy_list(list);
return 0;
}



#include <iostream>
#include <cstring>
#include "DTString.h"
using namespace std;
using namespace DTLib;
void HanoiTower(int n, char a, char b, char c) // a ==> src b ==> middle c ==> dest
{
if( n == 1 )
{
cout << a << "-->" << c << endl;
}
else
{
HanoiTower(n-1, a, c, b);
HanoiTower(1, a, b, c);
HanoiTower(n-1, b, a, c);
}
}
int main()
{
HanoiTower(3, 'a', 'b', 'c');
return 0;
}



e始终指向字符串的开头,用来打印,s用来控制交换。
一开始,a和a交换,全排列b、c。
然后,a和b交换,全排列a、c。
然后交换a和c,全排列b、a。
如果两个字符是一样的,就没有必要交换,否则全排列有重复的现象。
#include <iostream>
#include <cstring>
#include "DTString.h"
using namespace std;
using namespace DTLib;
void HanoiTower(int n, char a, char b, char c) // a ==> src b ==> middle c ==> dest
{
if( n == 1 )
{
cout << a << "-->" << c << endl;
}
else
{
HanoiTower(n-1, a, c, b);
HanoiTower(1, a, b, c);
HanoiTower(n-1, b, a, c);
}
}
void permutation(char* s, char* e) // e始终指向字符串开头,用于打印
{
if( *s == '\0' )
{
cout << e << endl;
}
else
{
int len = strlen(s);
for(int i=0; i<len; i++) //第一个字符一次和后面的元素交换
{
if( (i == 0) || (s[0] != s[i]) )
{
swap(s[0], s[i]); // 交换
permutation(s+1, e); // 交换之后将子串全排列
swap(s[0], s[i]); // 再交换回来
}
}
}
}
int main()
{
char s[] = "abc";
char s1[] = "aac";
permutation(s, s);
cout << "----------" << endl;
permutation(s1, s1);
return 0;
}

posted on 2020-08-15 21:20 lh03061238 阅读(141) 评论(0) 收藏 举报
浙公网安备 33010602011771号