使用栈实现阶乘函数的递归

《数据结构与算法JavaScript描述》

第4章 栈(Stack)

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8 <script>
 9     function Stack () {
10         this.dataStore = [];
11         this.top = 0;
12         this.push = push;
13         this.pop = pop;
14         this.peek = peek;
15         this.length = length;
16         this.clear = clear;
17     }
18     function push (element) {
19         this.dataStore[this.top++] = element;
20     }
21     function pop () {
22         var popped = this.dataStore[--this.top];
23         this.dataStore.length = this.top;
24         return popped;
25     }
26     function peek () {
27         return this.dataStore[this.top-1];
28     }
29     function length () {
30         return this.top;
31     }
32     function clear () {
33         this.top = 0;
34         delete this.dataStore;
35         this.dataStore = [];
36     }
37     function mulBase(num,base) {
38         var s = new Stack();
39         do {
40             s.push(num % base);
41             num = Math.floor(num /= base);
42         } while (num > 0) {
43             var converted = ‘‘;
44             while ( s.length() > 0 ) {
45                 converted += s.pop();
46             }
47             return converted;
48         }
49     }
50     function factorial(n) {
51         if (n === 0) {
52             return 1;
53         } else {
54             return n * arguments.callee(n-1);
55         }
56     }
57     function fact(n) {
58         var s = new Stack();
59         while (n > 1) {
60             s.push(n--);
61         }
62         var product = 1;
63         while (s.length() > 0) {
64             product *= s.pop();
65         }
66         return product;
67     }
68     function myFactorial(n) {
69         var dataStore = [];
70         for ( var i = 1; i <= n; i++) {
71             dataStore.push(i);
72         }
73         var product = 1;
74         while (dataStore.length>0) {
75             product *= dataStore.pop();
76         }
77         return product;
78     }
79     console.log(factorial(5));
80     console.log(fact(5));
81     console.log(myFactorial(5));
82 </script>
83 </body>
84 </html>

50行~78行

使用栈实现阶乘函数的递归,前两种是书中的提供的函数,第三种是自己根据理解修改的函数。

时间: 2024-10-03 13:38:48

使用栈实现阶乘函数的递归的相关文章

函数递归与栈的关系

首先通过反汇编语言,我们来了解一下最简单的递归函数与栈之间的关系. 如何获得反汇编语言,在visual studio 2008中,在debug环境下,在debug/windows/disassembly中可以查看反汇编之后的语言.现在我们看一下阶乘n!的实现 其C语言实现代码如下 [cpp] view plaincopy #include <stdio.h> int factorial(int n); int main(void) { int fact; fact = factorial(4)

递归5--汉诺塔问题的栈实现

递归5--汉诺塔问题的栈实现 汉诺塔的递归解法:http://www.cnblogs.com/Renyi-Fan/p/6949515.html 一.心得 系统里面的递归就是靠栈来维护的,区别我们普通栈的是维护递归的那个栈有返回地址递归每深入一层,栈顶元素加一递归每退出一层,栈顶元素减一返回地址是执行完这一层,返回到上一层的地址 就是从栈里面取元素然后操作这个元素,如此循环往复,和队列操作几乎完全一样然而这里用队列不得行,因为最前面的问题分解的子问题没有放在队列最前面 二.分析 三.代码及结果 1

栈实现递归

首先我们先来看一个程序;我相信看完这个程序;你们可以大概了解: /* * 2015年5月6日13:57:22 * 目的:通过栈的数据结构来实现递归 * 深入了解递归的本质. * 下面我分别举2个例子,就是分别用递归和栈的形式 * 来实现f(n) = 1+2+...+n自然数的相加;方法很简单, * 主要是为了让我们了解递归的内部实现机制. */ /* * 操作系统在调用递归函数是分为两步: * 1.将调用函数的地址和变量存起来(stack)然后为被调用函数开辟内存空间. * 2.将被调用函数的结

39.递归颠倒栈

http://zhedahht.blog.163.com/blog/static/25411174200943182411790/ 分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈.这时栈也就颠倒过来了.颠倒一个数组是一件很容易的事情.不过这种思路需要显示分配一个长度为O(n)的数组,而且也没有充分利用递归的特性. 我们再来考虑怎么递归.我们把栈{1, 2, 3, 4, 5}看成由两部分组成:栈顶

使用递归反转一个栈

反转递归栈的内容 使用递归,一定要明白递归结束的条件,假如栈中只有一个元素或者没有元素,那么这个栈就不用递归.那么我们将栈顶元素取出来,将余下的元素进行反转,那么将取出的元素放到栈的底部即可. 对于将一个元素放到底部,又是一个递归的调用,如果栈为空,那么直接将元素存放到栈的底部即可,如果栈中有元素,那么取出栈内的元素,将原来的元素再次调用函数存放到栈底,然后将取出的元素压入栈即可. 感觉这个例子是利用递归的典范 #include <iostream> #include <stack>

3.4.4 利用栈将递归转换成非递归的方法

在函数执行时系统需要设立一个“递归工作栈”存储第一层递归所需的信息,此工作栈是递归函数执行的辅助空间,所以可以看出,递归程序在执行时需要系统提供隐式栈这种数据结构来实现,对于一般的递归过程,仿照递归算法执行过程中递归工作栈的状态变化可直接写出相应的非递归算法.这种利用栈消除递归过程的步骤如下. (1)设置一个工作栈存放递归工作记录(包括实参.返回地址及局部变量等) (2)进入非递归调用入口(即被调用程序开始处)将调用程序传来的实在参数和返回地址入栈(递归程序不可以作为主程序,因而可认为初始是被某

栈和递归的关系 144:Binary Tree Preorder Traversal

前序遍历:根左右 //用栈来实现非递归解法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> preorderTraversal(T

递归&amp;栈帧空间

递归函数: 自己调用自己的函数 1 def digui(n): 2 print(n) 3 if n > 0: 4 digui(n-1) 5 print(n) 6 7 digui(5) 执行结果: 1 5 2 4 3 3 4 2 5 1 6 0 7 0 8 1 9 2 10 3 11 4 12 5 执行过程: 1 """ 2 3 代码从上到下执行: 4 digui(5) 5 print 5 6 digui(4) 7 print 4 8 digui(3) 9 print 3

数据结构——30行代码实现栈和模拟递归

本文始发于个人公众号:TechFlow,原创不易,求个关注 栈的定义 原本今天想给大家讲讲快速选择算法的,但是发现一连写了好几篇排序相关了,所以临时改了题目,今天聊点数据结构,来看看经典并且简单的数据结构--栈. 栈这个结构我想大家应该都耳熟能详,尤其是在很多地方将和堆并列在一起,称作"堆栈"就更广为人知了.但其实堆和栈本质上是两种不同的数据结构,我们不能简单地混为一谈.让我们先从比较简单的栈开始. 栈和队列的本质其实都是数组(严格地说是线性表).只不过我们在数组上增加了一些限制,使得