用C++和PHP实现递归算法实例-数据结构与算法学习

递归算法:就是一种直接或间接调用自身的算法。

实现过程:通过函数或者子过程来完成,在函数或者子过程中编写代码直接或间接的调用自己,即可完成递归操作。(相同类别的问题,把问题层层转换为规模缩小的子问题到最小问题有已知条件,然后来求解,然后得到结果逐级返回。其实也是一种循环。)

最主要体现:小的代码量解决了非常复杂的问题

特点:
1、递归就是方法里调用自身
2、必须有一个明确的递归结束条件,称为递归出口。
3、简洁但是运行效率较低,一般不提倡使用
4、每一层的返回点、局部变量等开辟了栈来存储,递归次数过多容易造成栈溢出。

实例1:求阶乘

C++代码:

 代码如下 复制代码
#include<iostream>
int factorial(int n);
int main()
{
    using namespace std;
    int n;
    cout << "请输入一个数字:";
    cin >> n;
    cout << n << "的阶乘为: " << factorial(n) <<endl;
    return 0;
}
int factorial(int n)
{
    if (n == 1)
        return 1;
    return n*factorial(n-1);
}

实例2:数制转换

代码:

 代码如下 复制代码
#include<iostream>
#include<cstring>
void feelTheBase(char *s, int n, int sys);
int main()
{
    using namespace std;
    char s[60];
    int n,sys;
    cout << "请输入一个整数:";
    cin >> n;
    cout << "请输入要转换的进制类型(2,8,16):";
    cin >> sys;
    feelTheBase(s, n, sys);
    cout << n << "转换成" << sys << "进制结果为: " << s <<endl;
    return 0;
}
void feelTheBase(char *s, int n, int sys)
{
    char bit[] = {"0123456789ABCDEF"};
    int len;
    if (n == 0)
    {
        strcpy(s, "");
        return;
    }
    feelTheBase(s, n/sys, sys);
    len = strlen(s);
    s[len] = bit[n%sys];
    s[len+1] = '';
}

实例3:列出某个目录下所有的子目录和文件(还可以用scandir函数更方便)

PHP实现代码:

 代码如下 复制代码
<?php
function rec($dir, $lev=0){
    $dh = opendir($dir);
 while (($file = readdir($dh)) != false) {
  if ($file == '.' || $file == '..') {
   continue;
  }
  if (is_dir($dir.'/'.$file)){
      $arr = explode("/",$dir.'/'.$file);
   $lev = count($arr)-3;
      echo str_pad('',$lev, "--")."目录".$file."<br/>";
   rec($dir.'/'.$file, $lev+1);
  }else {
   echo str_pad('',$lev, "--").$file."<br/>";
     }
 }
 
 closedir($dh);
}
$dir = "./";
rec($dir);
?>

运行结果:

 

时间: 2024-11-01 15:21:34

用C++和PHP实现递归算法实例-数据结构与算法学习的相关文章

计划如期完成,老师也给我回邮件了,继续坚持,努力。(顺便求推荐数据结构和算法学习的两本书)

问题描述 国庆二号号出去玩了一天,陪女朋友看"心花路放"(很赞的电影,推荐),购物,吃饭,然后剩下的六天假期都是在半学习半休闲的态度下度过的,因为女朋友和我一起在自习室,再加上国庆实在是有些懈怠心理.一期java语法基础包括集合框架,jdbc,sql,IO流,线程都简单的认识了,只局限于简单的使用(线程真的是认识的简单的不能再简单了).因为这些资料都是培训班的资料,所以做一个总结吧,培训班还是的确有独到之处的,目的性强,实用性强,速成性强,如果只有半年时间的话,我相信选择培训班是个很好

java数据结构和算法学习之汉诺塔示例_java

复制代码 代码如下: package com.tiantian.algorithms;/** *    _|_1              |                | *   __|__2             |                | *  ___|___3            |                |            (1).把A上的4个木块移动到C上. * ____|____4           |                | *    

大一学生数据结构与算法的先后取舍

[来信] 在上学期,突然一天一位学长问我要选择哪个方向,指的是算法和一般的开发.我回答他算法,而他说我对语言学的太心急,太快,不像是喜欢算法的,并和我说算法玩玩就好,不要陷得太深,并建议我走一般开发的路子.虽然学长学的挺好,但就比我大一岁,我还是不太相信他说的.后来在学校acm实验室纳新时,我还是按捺加不住入了. 加入后,我开始对算法有了一点了解,并开始学习算法.本来我就是在我校oj上刷刷题.放假时借了本 <算法之道>,想在假期恶补一下,可是发现看不太懂.索性就不看了.因为acm实验室的题目在

《数据结构与算法 C语言版》—— 3.8习题

前言 "数据结构"是计算机程序设计的重要理论技术基础,是计算机学科的核心课程,也是计算机专业考研的必考课程,同时已成为其他理工科专业的热门课程.学好该课程,不仅对学习后续算法设计.数值分析.操作系统.编译原理等课程有很大帮助,而且在实际中有广泛的用途. 数据结构主要研究数据的各种组织形式以及建立在这些结构之上的各种运算的实现.它不仅为用计算机语言进行程序设计提供了方法性的理论指导,还在一个更高的层次上总结了程序设计的常用方法和常用技巧. "数据结构"课程的特点是概念

《数据结构与算法:Python语言描述》一1.4数据结构

1.4数据结构 从程序输入和输出的角度看,用计算机解决问题,可以看作实现某种信息表示形式的转换.如图1.5所示,把以一种形式表示的信息(输入)送给程序,通过在计算机上运行程序,产生出以另一种形式表示的信息(输出).如果: 具体的"信息表示A"表达了需要求解的某个问题的实例. 得到的"信息表示B"表达了与这个实例对应的求解结果. 那么就可以认为,这个程序完成了该问题实例的求解工作. 为了能用计算机处理与问题有关的信息,就必须采用某种方式表示它,并将相应表示送入计算机.

《数据结构与算法:Python语言描述》一1.3算法和算法分析

1.3算法和算法分析 本节集中讨论算法的问题,特别是算法的性质及其分析技术. 1.3.1问题.问题实例和算法 在考虑计算问题时,需要清晰地区分问题.问题实例和算法三个概念,并理解它们之间的关系,这就是本小节讨论的内容.三个基本概念考虑一个计算问题时,需要注意到三个重要概念:问题:一个问题W是需要解决(需要用计算求解)的一个具体需求.例如判断任一个正整数N是否为素数,求任一个方形矩阵的行列式的值等.虽然可以严格定义"问题"的概念,但在这里还是想依靠读者的直观认识.总而言之,现实世界中存在

C++数据结构与算法专题

快速排序算法的C++实现 详解qsort函数的用法 C++求二个数的最大公约数与最小公倍数实例 小览CallStack(调用栈)(三)-用调试器脚本查看调用栈信息 小览call stack(调用栈) (二)--调用约定 小览call stack(调用栈) (一) C++/CLI中栈对象的设计问题 POJ 1694 C++ (排序) 高效实现Josephus算法 利用堆排序实现学生成绩管理 C++双向循环链表的操作与实现 基于Crtpto++的RSA签名算法 自定义函数使用map排序 C++数据结

数据结构与算法系列(1)时间测试

前言 好久都把数据结构和算法的东西忘完了,最近想重温下这些知识.因此就写了<<数据结构与 算法系列>的文章,希望能和大家共同学习,共同探讨这方面的知识.希望大家多多指异. 1.时间测试 由于本部分内容采用了一种实用的方法来分析数据结构与算法检测,所以在这里避开了使用大O分 析法,而采用运行简单基准测试的方法来代替.这种测试将会说明运行一段代码需要多少秒数(或者 无论什么时间单位). 基准法测试是使用时间测试的方法来衡量运行完整算法所花费的时间长度.如同科学一样,基准测 试也像是一门艺术,

JavaScript中数据结构与算法(三):链表

  这篇文章主要介绍了JavaScript中数据结构与算法(三):链表,本文分别讲解了单链表与双链表以及增加节和删除节的代码实例,需要的朋友可以参考下 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言中数组固定长度的问题(当数组填满后再添加就比较困难了,包括添加删除,都是需要把数组中所有的元素全部都变换位置的,javascript的的数组确实直接