递归和非递归分别实现求n的阶乘

思路:举例求6的阶乘,6*5*4*3*2*1。可以将5开始看成另一个整型变量n,用一个循环每次将n的值减少1,。而递归也是如此,每次调用函数的时候将变量减一就可以。

方法一:非递归

 1 //非递归:
 2 #include<stdio.h>
 3 int main()
 4 {
 5     int num = 1;
 6     printf("请输入数字:\n");
 7     scanf("%d",&num);
 8     int n = num - 1;
 9     while (n > 0)
10     {
11         num = num * n;
12         --n;
13     }
14     printf("%d",num);
15     return 0;
16 }

方法二:递归法

 1 //递归:
 2 #include<stdio.h>
 3
 4 int Find_num(int num)
 5 {
 6     if (num == 0)
 7     {
 8         return 0;
 9     }
10     else if (num == 1)
11     {
12         return 1;
13     }
14     else
15     {
16         return num * Find_num(num - 1);
17     }
18 }
19
20 int main()
21 {
22     int num = 1;
23     printf("请输入数字:\n");
24     scanf("%d",&num);
25     int find_num = Find_num(num);
26     printf("%d",find_num);
27     return 0;
28 }

原文地址:https://www.cnblogs.com/cuckoo-/p/10344796.html

时间: 2024-12-16 05:51:06

递归和非递归分别实现求n的阶乘的相关文章

算法学习 - 递归与非递归,位运算与乘除法速度比较

递归调用非递归调用 运行时间比较 结论 位运算与乘除法 结论 递归调用/非递归调用 我们都知道,很多算法,都是用递归实现的.当然它们同时也是可以用非递归来实现. 一般我们在对二叉树进行遍历的时候,还有求斐波那契数的时候,递归是非常简单的.代码容易懂,好实现. 但是递归的时候,有一个问题,就是需要压栈.为什么要压栈呢?因为当我在函数内部调用自身的时候,要中断当前的操作继续跳转到下一次的实现,而当前运行的状态要保存起来.所以就把当前状态进行压栈,等到运行到递归条件结束的时候,再弹栈. 所以递归就是需

递归与非递归及其相互转换

一.什么是递归 递归是指某个函数直接或间接的调用自身.问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出,这些子问题的解就构成里原问题的解了. 二.递归的几个特点 1.递归式,就是如何将原问题划分成子问题. 2.递归出口,递归终止的条件,即最小子问题的求解,可以允许多个出口. 3.界函数,问题规模变化的函数,它保证递归的规模向出口条件靠拢 三.递归的运做机制 很明显,很多问题本身固有的性质就决定此类问题是递归定义,所以递归程序很直接算法程序结构清晰.思路明了.

二叉树的递归和非递归遍历

// 本次练习的是  二叉树的  递归和非递归  遍历   以及二叉树的  节点数  高度  叶子节点数   和查找功能  //如果要是变量在函数栈回归时不回归原值,则可以用引用// #define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<stack>#include<queue>using namespace std; template<class T>struct BinaryTreeNod

全排列算法的递归与非递归实现

全排列算法的递归与非递归实现 全排列算法是常见的算法,用于求一个序列的全排列,本文使用C语言分别用递归与非递归两种方法实现,可以接受元素各不相同的输入序列. 题目来自leetcode: Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3

C实现二叉树(模块化集成,遍历的递归与非递归实现)

C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue.c : 循环队列的相关操作函数定义.BinTree.c : 二叉树的相关操作的函数定义,层序序列生成二叉树,二叉树的前序序列.中序序列.后序序列的递归和非递归实现,求叶子结点的递归与非递归实现,求树高.我目前还是新手且第一次写类似的博客,文章中难免会有错误!如发现错误,望各路大神能够指出!详见源代码

递归转非递归(实例)

递归调用示例算法1.10  求取数组元素的最大值(递归算法)    procedure MAX1(i)    // 查找数组A中最大值元素,并返回该元素的最大下标.//        global integer n,A(1:n),j,k        integer i        if i<n then j←MAX1(i+1)  //递归调用//               if A(i) > A(j) then k←i                   else k←j       

台阶问题引出的递归和非递归的思考

一个台阶总共有n级,如果一次可以跳1级,也可以跳2级.求总共有多少总跳法,并分析算法的时间复杂度. 如果看到过这个题目的童鞋们,可能很快就有思路了,这个属于动态规划的典型题目. 基本思路如下: 假设n个台阶共有f(n)个跳法.那么我第一步可以跳1级,可以跳2级. 如果第一步跳1级,那么之后我有f(n-1)种跳法. 如果第一步跳2级,那么之后我有f(n-2)中跳法. 所以,得到下面的公式 一看到这个公式,很多人就会想到Finbonacci队列(兔子繁殖问题),很多人都是通过这个例子学会的递归方法.

数据结构——二叉树遍历之“递归与非递归遍历”

简述 二叉树的遍历分为先序遍历.中序遍历和后序遍历.如下图所示: 递归遍历 private void bianli1(List<Integer> list, TreeNode root) { // 先序遍历 if (root == null) { return; } list.add(root.val); bianli1(list, root.left); bianli1(list, root.right); } private void bianli2(List<Integer>

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {