什么是递归调用

递归调用是一种特殊的嵌套调用,是某个函数调用自己或者是调用其他函数后再次调用自己的,只要函数之间互相调用能产生循环的则一定是递归调用,递归调用一种解决方案,一种是逻辑思想,将一个大工作分为逐渐减小的小工作,比如说一个和尚要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了

递归举例:

C语言中的递归

计算阶乘的代码

long fact(long n)

{

if(n==0||n==1) return 1L;

else return n*fact(n-1);

}

这个函数叫做fact,它自己调用自己,这个就是一个典型的递归调用,调用过程类似一个栈。

注: 主调函数又是被调函数。执行递归函数将反复调用其自身。 每调用一次就进入新的一层。

int f (int x)

{

int y;

z=f(y);

return z;

} 这个函数是一个递归函数。 但是运行该函数将无休止地调用其自身,这当然是不正确的。为了防止递归调用无终止地进行, 必须在函数内有终止递归调用的手段。常用的办法是加条件判断, 满足某种条件后就不再作递归调用,然后逐层返回。 下面举例说明递归调用的执行过程。

注:链表在某种程度上就是递归的调用.

Pascal中的递归

const

z=10000;

var

a:array[0..z+1]of integer;

n,j,i,k:longint;

begin

readln(n);write(n,‘!=‘);

begin

a[1]:=1;

for i:=1 to n do

begin

for j:=1 to z do

a[j]:=a[j]*i;

for k:=1 to z do

begin

a[k+1]:=a[k+1]+a[k]div 10;

a[k]:=a[k]mod 10;

end;

end;

i:=z;k:=0;

repeat

if a[i]<>0 then k:=1;

i:=i-1;

until k=1;

k:=0;

for j:=i+1 downto 1 do

write(a[j]);

end;

writeln;

end.

c++语言中的递归

#include<iostream>

using namespace std;

int fac(int n)

{

int s=1;

for (int i=n;i>0;i--)

{

if (s<=s*i) s=s*i;

else

{

cout<<"over int area"<<endl;

return 0;

};

}

return s;

}

void main()

JAVA写的递归调用

public class TestDg {

public static void main(String[] args) {

System.out.println(method(5));

}

public static int method(int n) {

if (n == 1)

return 1;

else

return n * method(n - 1);

}

}

汉诺塔------软件递归调用里面最经典的一个案例

#include<stdio.h>

int c=0; /* 全局变量,搬动次数 */

void move(char x,int n,char z)

{ /* 第n个圆盘从塔座x搬到塔座z */

printf("第%i步: 将%i号盘从%c移到%c\n",++c,n,x,z);

}

void hanoi(int n,char x,char y,char z)

{ /* 将塔座x上按直径由小到大且自上而下编号为1至n的n个圆盘 */

/* 按规则搬到塔座z上。y可用作辅助塔座 */

if(n==1)

move(x,1,z); /* 将编号为1的圆盘从x移到z */

else

{

hanoi(n-1,x,z,y); /* 将x上编号为1至n-1的圆盘移到y,z作辅助塔 */

move(x,n,z); /* 将编号为n的圆盘从x移到z */

hanoi(n-1,y,x,z); /* 将y上编号为1至n-1的圆盘移到z,x作辅助塔 */

}

}

void main()

{

int n;

printf("3个塔座为a、b、c,圆盘最初在a座,借助b座移到c座。请输入圆盘数:");

scanf("%d",&n);

hanoi(n,‘a‘,‘b‘,‘c‘);

}

递归详解

调用前

一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需要完成3件事情:

(1)将所有的实参、返回地址等信息传递给被调用函数保存;

(2)为被调用函数的局部变量分配存储区;

(3)将控制转移到被调函数的入口。

调用中

而从被调用函数返回调用函数之前,系统也应完成3件工作:

(1)保存被调函数的计算结果;

(2)释放被调函数的数据区;

(3)依照被调函数保存的返回地址将控制转移到调用函数。当有多个函数构成嵌套时,按照后调用先返回的原则。

递归函数特点

所有递归函数的结构都是类似的。

(1)函数要直接或间接调用自身。

(2)要有递归终止条件检查,即递归终止的条件被满足后,则不再调用自身函数。

(3)如果不满足递归终止的条件,则调用涉及递归调用的表达式。在调用函数自身时,有关终止条件的参数要发生变化,而且需向递归终止的方向变化。

总结

函数的调用原则和数据结构栈的实现是相一致。也说明函数调用是通过栈实现的。(注:此文章来自百度)

原文地址:https://www.cnblogs.com/BloodstreetRecord/p/10253763.html

时间: 2024-11-05 15:01:55

什么是递归调用的相关文章

浅谈递归调用的个人领悟

从大一开始学c,就不是挺理解递归的,最近突然有所体会: 递归调用中递归调用的函数可以把它想象成为一个树的结点,在函数中调用自身就是一个分支,直到出口条件时就是这棵树的叶子结点.叶子的值便是出口返回的值.最后从叶子结点按照你所调用的方法向上返回值,最终结束递归调用.

案例------递归调用

1  什么是递归: 实现某些功能不用递归可能要几十行代码,用递归可能几行就搞定了,而且代码清晰简洁.一直以为递归也就是自己调用自己,有一个出口条件,让他停止递归,退出函数,其实的特点并非就这些. 递归还有一个非常重要的特点:先进后出,跟栈类似,先递进去的后递出来.由于递归一直在自己调用自己,有时候我们很难清楚的看出,他的返回值到底是哪个,只要你理解了先进后出这个特点,你就会明白,第一次调用时,作为返回值的那个变量的值就是递归函数的返回值.先进后出吗,他是第一个进来,也就是最后出去的那个,当然就是

方法的创建、重载及递归调用

-----------siwuxie095 1.方法的定义 方法就是一段可重复调用的代码段 定义格式: 「方法的返回值类型为 void 时,不需要返回值,小括号 () 里可以有参数」 2.方法的重载: 方法名称相同,但是参数的类型和个数不同(即参数可辨), 通过传递参数的个数和类型不同来完成不同的功能 调用时系统自动匹配 3.方法的递归调用 递归调用是一种特殊的调用形式,就是方法自己调自己 常用于遍历(如:文件夹等) 如:从 1 加到 100 代码: package com.siwuxie095

python 3 递归调用与二分法

递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return age(n-1)+2 # 调用函数本身 print(age(5)) 打印结果 26 递归的执行分为两个阶段: 1 递推 2 回溯 示例图 递归特性: 1.必须有一个明确的结束条件 2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3.递归效率不高,因为每次调用自身时,都会在内存中创建一个新

1113 递归调用的次数统计

题目来源:https://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1113Description如下程序的功能是计算 Fibonacci数列的第n项.函数fib()是一个递归函数.请你改写该程序,计算第n项的同时,统计调用了多少次函数fib(包括main()对fib()的调用).#include<stdio.h>int fib(int k); int main(void ){    int n;    scanf("%d", &am

[java基础]递归调用

递归调用:通过调用或间接调用程序自身 递归调用最重要的一点是,一定要有个头,要是没有头,一直调用下去,就成了死循环了. 代码示例: /** * 递归调用代码示例<br> * 说明:一个方法,自己直接或间接的调用自己.<br> * @author 冲出地球 * */ public class Recursion { /** * 示例程序:阶乘<br> * 一个数的阶乘,就是从1一直乘到那个数<br> * 示例:2! = 1*2 5! = 1*2*3*4*5&l

python-day5-生成器迭代器及递归调用

生成器是一个可迭代的对象,它的执行会记住上一次返回时在函数体中的位置.对生成器第二次(或第 n 次)调用跳转至该函数上次执行位置继续往下执行,而上次调用的所有局部变量都保持不变. 生成器的特点:1.生成器是一个函数,而且函数的参数都会保留.2.迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的.3.函数中yield就是个生成器,多次调用时,根据调用位置依此往下执行,而无法返回 1 #__next__方法会将生成器依此调

编程题:用递归调用实现,求N!(!阶乘)。

#include<stdio.h> long fac(int n) { if(n==1) return 1L;             /*"1L"为长整型常量*/ else return n*fac(n-1); } void main() {int m; scanf("%d",&m); printf("%2d!=%d\n",m,fac(m)); } 算法解析: 运行结果: 编程题:用递归调用实现,求N!(!阶乘).,布布扣,

函数的递归调用

递归调用即在定义函数的时候,在函数内部再调用自己,也就是函数自己调用自己,通常用于计算阶乘 注意一点的是,如果函数一直调用自己,那就成了死循环了,因此我们通常会设一个条件,当条件为假时函数就终止了 In [15]: def factorial(n): ....: if n == 0: ....: return 1 ....: else: ....: return n + factorial(n-1) ....: In [16]: factorial(5) # 计算 5+4+3+2+1 Out[1

Python-函数的递归调用

递归调用顾名思义即在函数内部调用函数(自己调用自己),通常用它来计算阶乘,累加等 注意: - 必须有最后的默认结果 if n ==0,(不能一直调用自己,如果没有可能会造成死循环) - 递归参数必须向默认的结果收敛 func(n-1) 例子1:计算5的阶乘 #!/usr/bin/env python def func(n): if n == 0: return 1 else: return n * func(n-1) print func(5) 例子2:计算1到100的和 #!/usr/bin/