从汉诺塔问题看 函数尾部递归的消除 (C语言版)

2024-02-03 11:18

本文主要是介绍从汉诺塔问题看 函数尾部递归的消除 (C语言版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/************************************************************************************************
                                               汉诺塔 函数尾部递归的消除
由于函数调用是通过堆栈来完成,因此函数的递归将会造成大量内存空间的浪
费,因此在没有必要的情况下不宜用递归。有时我们可以用递归的思想来考虑问题,
然后通过某些方法来消除递归,而这里仅仅考虑当递归语句是函数中最后执行的语
句情况下的消除方法,即通过使用循环可以将递归改变为迭代。下面第一个程序是
常见的汉诺塔程序,第二个程序是递归消除的实现,程序质量大幅度提升。
程序在TC-WIN成功编译运行
Leo,2006/10/6
                                                                 stefzeus@163.com

************************************************************************************************/

/*            Answer  for Hanoi                               */
/*      move() uses two recursion to solve the problem.       */

#include <stdio.h>
#include <conio.h>
#include <dos.h>

void move(int ,int ,int ,int );

void main()
{
    int disk;
    clrscr();
    while(1)
       {
        printf("How many disk do you move:");
        scanf("%d",&disk);
        putchar('/n');
        if( disk<21 && disk >0 )
            break;
        else
            printf("Warring:The disks are too more or too less,"
                    "please input again./n");

       }
    move(disk,1,3,2);
    getch();
   
}


/* move:moves count disk from start to finish using
        temp for temporary storage. uses two recursion */
void move(int disk,int start,int finish,int temp)
{

    if(disk>0)
       {
        move(disk-1,start,temp,finish);        /* firth recursion  */
        printf("move %dth from %d to %d./n/n",disk,start,finish);
/*        sleep(1);      */           /* delay make user can see the result */
        move(disk-1,temp,finish,start);       /* second recursion  */
       }
   
}

/****************************************************************************************************************/

/*                  Hanio Of Second Edition                               */
/*      move() uses noly one recursion (get rid of recursion in the tail  */
/*  of function. )                                                        */

 


#include <stdio.h>
#include <conio.h>
#include <dos.h>

void move(int ,int ,int ,int );

void main()
{
    int disk;
    clrscr();
    while(1)
       {
        printf("How many disk do you move:");
        scanf("%d",&disk);
        putchar('/n');
        if( disk<21 && disk >0 )
            break;
        else
            {
            printf("Warring:The disks are too more or too less,"
                    "please input again./n");
            continue;
            }
       }
    move(disk,1,3,2);
    getch();
   
}

 

/* move:moves count disk from start to finish using
        temp for temporary storage. uses one recursion.      */
void move(int disk,int start,int finish,int temp)
{
    int t;
    while(disk>0)
        {
        move(disk-1,start,temp,finish);        /* firth recursion  */
        printf("move %dth from %d to %d./n/n",disk,start,finish);
        sleep(1);                 /* delay make user can see the result */
        disk--;
        t=start;
        start=temp;
        temp=t;
        }
   
}

这篇关于从汉诺塔问题看 函数尾部递归的消除 (C语言版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/673979

相关文章

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数