极限递归(思维反转)

原创 2004年11月01日 14:15:00

递归是程序设计的基础,而且是很有潜力可挖的设计模式之一。递归有两种模式,一种是基于程序堆栈的内部递归,该方法用的最多,在小规模问题上最为方便,对于递归层次较深时,往往需要借助于外部的栈,但实现原理时一样的。

本文将介绍两个最基础的递归问题,该问题适合初学者,但解决该问题的方法要足够优雅,所以还是对能够熟练应用c++的同仁们有一定参考价值的。

汉诺塔问题

谈到递归,就不能不谈一下汉诺塔,这是个十分著名而且也十分有意思的递归问题,要求是利用三个底座来移动一堆圆盘,要求将圆盘从A底座全部移到C底座,移动的顺序则必须是每次移动均保证每个底座上处于下部的盘子大于处于上部的盘子的面积。

大家可以从谭老师的c程序设计上得到一个官方解,但那绝对不是最简洁和优雅的。下面我给出我的解法,算作抛砖,希望引出大家手里的玉。

 

#include <iostream.h>

#include <stdlib.h>

unsigned long time=0;

void hanor(int i,char a,char b,char c)

{

    if(i>=2)

        hanor(i-1,a,c,b);

    cout<<i<<": "<<a<<"--->"<<c<<" "<<++time<<endl;

    if(i>=2)

        hanor(i-1,b,a,c);

}

int main()

{

    hanor(16,'a','b','c');

    system("PAUSE");

    return 0;

}

 

八皇后问题

 

八皇后是另外一个递归经典问题,该问题要求在一个国际象棋盘上摆放8个皇后,皇后们均魅力四射,在米子型的格子上不允许其它皇后的存在,该问题较汉诺塔问题复杂一些,解答也较有趣一些。为了得到更加优雅和简洁的解法,我再冒昧抛一块砖。

 

#include <iostream>

using namespace std;

#include <stdlib.h>

int queens[9];

bool is;

int total=0;

void run(int num)

{

    for(int i=1;i<=8;i++)

    {

        queens[num]=i;

        is=true;

        for(int j=1;j<num;j++)

            if(queens[j]==queens[num]||queens[j]+(num-j)==queens[num]||

                queens[j]-(num-j)==queens[num])

            {

                is=false;

                break;

            }

            if(is)

            {

                if(num==8)

                {

                    for(int k=1;k<=8;k++)

                        cout<<queens[k]<<" ";

                    cout<<++total<<endl;

                }

                if(num<8)

                    run(num+1);

            }

    }

}

int main()

{

    run(1);

    system("PAUSE");

    return 0;

}

 

故意不作注释了,希望如此短小的代码,能够有人愿意阅读分析。

设计递归程序是很有趣和有挑战性的,如何优雅简洁,占用内存小,效率高,都是需要兼顾的,而且是构建许多实际应用的核心技术,大量的数据结构和算法,如BTree,桶、正则表达表达式匹配中,均大量使用了递归。希望该文能对大家有所借鉴。

单链表的反转(递归)

单项链表的反转指的是这样一类问题:给定一个单项链表的头指针 head,写一个算法,将其反转,并返回新的头指针 newHead。 注意点: (1)一般我们构建的单链表有两种,第一种是有头节点的单链表...
  • cyuyanenen
  • cyuyanenen
  • 2016年05月22日 10:15
  • 1236

反转一个整数 递归/原创

#include int MaxPower(int x){ if(x/10 == 0)  return 1; else  return 10 * MaxPower(x / 10);}int Conve...
  • leechiyang
  • leechiyang
  • 2005年12月06日 17:23
  • 727

rever_string()函数(递归实现)即递归实现字符串反转

一、实现功能: 将输入字符串abcde反转成edcba输出 二、代码 #include #include #include #define MAX_STR 10 void reve...
  • zhangchaoq
  • zhangchaoq
  • 2015年05月13日 14:48
  • 1131

java实现单链表反转(递归方式)

public class DiGuiFanZhuan { public static void main(String[] args) { Node head = new Node(0)...
  • u014430697
  • u014430697
  • 2015年11月24日 21:16
  • 1874

使用递归反转一个栈

反转递归栈的内容 使用递归,一定要明白递归结束的条件,假如栈中只有一个元素或者没有元素,那么这个栈就不用递归。那么我们将栈顶元素取出来,将余下的元素进行反转,那么将取出的元素放到栈的底部即可。 对...
  • yusiguyuan
  • yusiguyuan
  • 2015年08月21日 11:26
  • 1453

递归和非递归实现链表反转

链表反转是面试笔试常考题目,直接贴代码。 反转函数如下://思路为将节点从前到后依次放到表头,最后最后的节点到了最前面,最前面的节点到了最后面 void ReverseList(ListNode * ...
  • yunzhongguwu005
  • yunzhongguwu005
  • 2013年08月26日 16:43
  • 12778

使用递归方法实现数字反转 C语言实现

实现将整数进行反转,比如:整数12345,反转后为54321                                                整数120,反转后为21    ...
  • cngogsse
  • cngogsse
  • 2015年05月13日 17:01
  • 1002

C/C++:递归使用:使用递归反向写文件(例子)以及字符串翻转输出

#include #include void operate(FILE *read,FILE *write) { //准备空间用于保存读取的数据 char buffer[1024...
  • jiezhj
  • jiezhj
  • 2014年08月06日 16:48
  • 989

单链表反转(递归和非递归)

单链表反转有递归和非递归两种算法。 下面定义节点 typedef struct ListNode{ int value; ListNode* next; }ListNode; 在递归算法中的做法是...
  • KangRoger
  • KangRoger
  • 2014年03月02日 10:53
  • 20071

递归反转一个字符串

给定一个字符串“ABCDEFGHI”,用递归的方式将其反转。 思路:每次进行首尾字符交换,          第一次,将A和I交换,此时变成 IBCDEFGHA,此时递归的字符串应该变成其子串“B...
  • woyaowenzi
  • woyaowenzi
  • 2010年05月19日 01:11
  • 7179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:极限递归(思维反转)
举报原因:
原因补充:

(最多只允许输入30个字)