首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

递归的具体调用是如何样的啊

2013-01-23 
递归的具体调用是怎么样的啊?#includestdio.hint jiesheng(int n){int mif(n1)m1elsemjiecheng(n-

递归的具体调用是怎么样的啊?


#include<stdio.h>
int jiesheng(int n)
{
int m;
if(n==1)
m=1;
else
m=jiecheng(n-1)*n;
return m;
void main()
{
int m,n;
printf("input 1 number:");
scanf("%d",&n);
m=jiecheng(n);
printf("out=%d\n",m);
}

这里的具体过程是怎么样的啊?  










[解决办法]
函数自己调用自己,每次参数值不同而已
[解决办法]
输入一个数值,单步跟踪看看
[解决办法]
比如说输入3。
 1.运行void main 中m=jiesheng(n);
 2.运行int jiesheng(n) 中m1=jiesheng(3-1)*3;
 3.调用2的jiesheng(3-1),在自身调用一次m2=jiesheng(3-1-1)*2;
 4.调用3的jiesheng(3-1-1),再自身调用m3=1;
 5.m2=m3*2=1*2,m1=m2*3=1*2*3=6.
 最后,不必太纠结,自己可以单步调试设置断点
[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

[解决办法]
引用:
比如说输入3。
 1.运行void main 中m=jiesheng(n);
 2.运行int jiesheng(n) 中m1=jiesheng(3-1)*3;
 3.调用2的jiesheng(3-1),在自身调用一次m2=jiesheng(3-1-1)*2;
 4.调用3的jiesheng(3-1-1),再自身调用m3=1;
 5.m2=m3*2=1*2,m1=m2*3=1*2*3=6……

将jiecheng(n-1)*n一直压栈,当最后一次调用函数参数为1时,逐次出栈操作。
[解决办法]
你把下面的 的函数 在画图 中多粘贴 几份,然后就像多个函数的调用一样执行就可以了。

int jiecheng(int n)
{
if(n<=1)return 1;
return jiecheng(n-1)*n;
}

[解决办法]
和普通函数的调用是一样的
[解决办法]
用debugger跟踪执行的过程。

[解决办法]
debug一下
或者自己在草稿纸上写一个执行过程就知道了
[解决办法]
递归调用就是压栈和出栈的过程,可以参考c和指针的讲解
[解决办法]
这里的具体过程是怎么样的啊? 

int jiesheng(int n)
{
int m;
if(n==1)
m=1;
else
m=jiecheng(n-1)*n;
return m;
}

用一個簡單點的實例演示一下,比如n=3,過程如下:


jiesheng(3);          //n==3
  m=jiesheng(2)*3;    //需要繼續執行jiesheng(2) //n==2
    m=jiesheng(1)*2;  //需要繼續執行jiesheng(1)  // n==1
      m=1;            //if(n==1),  作爲jiesheng(1)的返回值
    m=1*2;            // 作爲jiesheng(2)的返回值
  m=1*2*3             // 作爲jiesheng(3)的返回值
return m;             //得到結果6
  
  

------解决方案--------------------


递归算法可行的原因是,问题能被分解成同质的、较小的问题;并且有一个可到达的终点。
递归类似于把数学归纳反过来
这个问题可以分为两个过程
1,逆推,把求f(k)转换为求f(k-1),一直走啊走,直到f(n)为某个已知的值,本例中就是1.这实际就是函数入栈的过程
 2,顺推,反过来已知jiecheng(1)就可以得到jiecheng(2)....直到阶乘k。实际就是函数退栈的过程。

热点排行