
递归
数据结构与算法 --- 递归
小馋喵星人
这个作者很懒,什么都没留下…
展开
-
【经典算法实现 16】阿克曼函数(非递归实现 代码优化)
接着前两篇文章:《【经典算法实现 14】阿克曼函数(手动推导求解、递归实现、非递归实现)》《【经典算法实现 15】阿克曼函数 – 非递归实现》本文是对前面代码的优化:优化思路为:为方便理解,将 m 和 n 放在同一个链表中实现,成对push,成对pop为方便理解,将代码逻辑与递归函数 结构写在一样,方便他们对照学习代码如下:#include <stdio.h>// 定义单向循环链表结构体 typedef struct ListNode{ long long m;原创 2020-08-06 16:30:05 · 1487 阅读 · 0 评论 -
【经典算法实现 15】阿克曼函数(非递归实现)
【经典算法实现 15】阿克曼函数 -- 非递归实现一、阿克曼函数 -- 非递归实现二、阿克曼函数 -- 非递归实现 代码优化在前面《【经典算法实现 14】阿克曼函数(手动推导求解、递归实现、非递归实现)》 中,我们实现了阿克曼函数的手动推导及递归实现代码,在本文中,我们来研究下它的非递归实现。其递归代码为:long ack(int m,int n){ if(m == 0){ return n+1; }else if(n == 0){ return原创 2020-08-06 15:09:45 · 3023 阅读 · 0 评论 -
【经典算法实现 14】阿克曼函数(手动推导求解、递归实现、非递归实现)
【经典算法实现 14】阿克曼函数---手动推导求解、递归实现、非递归实现一、阿克曼函数 手动求解二、阿克曼函数 递归实现三、阿克曼函数 非递归实现该题目来自腾讯实习生的招聘笔试,题目给出如下的递归函数,求ack(3,3)的值。long ack(int m,int n){ if(m == 0){ return n+1; }else if(n == 0){ return ack(m - 1, 1); }else{ return ack原创 2020-08-04 18:06:57 · 3761 阅读 · 2 评论 -
【经典算法实现 13】斐波那契数列(矩阵法实现)
前面我们分别利用递归 和 循环方法来实现了计算Fibonacci 的值,《【经典算法实现 12】斐波那契数列》现在我来看一种效率最高的算法O(logn),首先我们有下面的数学公式:我们可以用数学归纳法证明如下:Step1: n=2时Step2:设n=k时,公式成立,则有:等式两边同乘以[1,1;1,0]矩阵可得:左=右,这正是n=k+1时的形式,即当n=k+1时等式成立。由Step1和Step2可知,该数学公式成立。由此可以知道该问题转化为计算右边矩阵的n-1幂问题。我们利用分治原创 2020-08-04 15:31:01 · 3035 阅读 · 7 评论 -
【经典算法实现 12】斐波那契数列
【经典算法实现 12】斐波那契数列1、方法一、递归求解2、方法二、循环法求解3、方法三、循环法求解1、方法一、递归求解定义Fibonacci数列如下:代码实现如下:// 实现求解 Fibonacci 数列#include <stdio.h>// 方法一、递归求解结果: long long Cal_Fibonacci(int val){ // 当 val = 0 或 val = 1时 if(val == 0 || val== 1) return val; // 当原创 2020-08-04 14:46:44 · 859 阅读 · 0 评论 -
【经典算法实现 10】八皇后问题
【经典算法实现 10】八皇后问题一、八皇后问题描述二、代码实现三、程序运行结果1. 棋盘数量为 8 时: #define Eight_Queen_NUM 82. 棋盘数量为 9 时: #define Eight_Queen_NUM 93. 棋盘数量为 10 时: #define Eight_Queen_NUM 10一、八皇后问题描述八皇后问题,一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能原创 2020-07-27 17:09:58 · 521 阅读 · 0 评论 -
【经典算法实现 9】约瑟夫环问题(单向循环链表 + 指针)
【经典算法实现 9】约瑟夫环问题一、约瑟夫环问题题目二、 题解一、约瑟夫环问题题目据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),原创 2020-07-27 14:08:30 · 650 阅读 · 0 评论 -
【经典算法实现 7】扬辉三角
扬辉三角主要是两边均为1,其余数为前顶上两数之和。1、代码实现#include <stdio.h>void generate_YangHuiTriangle(int **array, int len){ int i, j; for(i=0; i<len; i++){ // 给每一行的首尾元素赋值为 1 array[i][0] = array[i][i] = 1; // 计算中间节点的值 for(j=1; j<i; j++){ array[i].原创 2020-07-24 16:12:04 · 460 阅读 · 0 评论 -
【经典算法实现 2】递归
一、 递归由于递归函数调用自己,因此编写这样的函数时很容易出错,进而导致无限循环。由此,编写递归函数时,必须告诉它何时停止递归。每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。其格式为:// 举例一,使用递归正序或逆序打序void func(i){ printf(" i=%d ",i); // 逆序打印,如果输入0,则打印 10,9,8,7,6,5,4原创 2020-07-10 10:53:04 · 361 阅读 · 0 评论 -
20150410 递归实现八皇后问题
20150410 递归实现八皇后问题 2015-04-10 Lover雪儿十九世纪著名的数学家高斯1850年提出: 在8x8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意的连个皇后都不能处于同一行、同一列或者统一斜线,问有多少种摆法。以下是其中一种解法,如图所示: 当年高斯先生没日没夜的计算,得出结论是76种。 其实正确的结论是92中,此处...原创 2015-04-10 21:30:00 · 467 阅读 · 0 评论 -
20150410 递归实现汉诺塔算法
20150410 递归实现汉诺塔算法 2015-04-10 Lover雪儿 1 //汉诺塔 2 #include <stdio.h> 3 4 static int i = 0; 5 6 //将n个盘子从x借助y移动z 7 //n:移动的个数 x:源地址 y:中间柱子 z:目的柱子 8 void move(int n, char x, char y, ...原创 2015-04-10 20:19:00 · 390 阅读 · 0 评论 -
递归打印级联目录
<?php/**递归打印级联目录**/function read_dir($path){static $dir_i = 0;$pre = ''; $dh = opendir($path);for($a=0; $a<$dir_i; $a++)$pre .= "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&a...原创 2015-02-05 12:01:00 · 372 阅读 · 0 评论 -
递归与迭代学习(联级目录的创建与删除)
一般来说,递归和迭代是可以互相转换的。迭代是有点类似栈的概念,后进先出,可以使用 array_pop 和array_push函数来用数组来实现栈的概念。下面看两个程序,及实现图就懂了: /***************************************************************************************************...原创 2015-02-05 12:00:00 · 411 阅读 · 0 评论