黑马程序员技术交流社区

标题: 数学老师后来去看大门了:求高手解释C语言的函数回调,... [打印本页]

作者: BOOM    时间: 2014-7-12 18:50
标题: 数学老师后来去看大门了:求高手解释C语言的函数回调,...
本帖最后由 BOOM 于 2014-7-13 21:19 编辑

函数回调怎么用啊,完全看不懂,就解释
作者: 温天恩    时间: 2014-7-12 20:48
你是指递归调用还是?
作者: BOOM    时间: 2014-7-12 21:28
也就是递归调用吧,别如说这个,求1 + 2  + 3 + ...+n 和,用函数回调实现
作者: BOOM    时间: 2014-7-12 21:36
也就是递归调用吧,别如说这个,求1 + 2  + 3 + ...+n 和,用函数回调实现
作者: BOOM    时间: 2014-7-12 21:38
比如这个 #include <stdio.h>

int sum(int i)
{
    if (i == 1) {
        return 1;
    }
    return sum(i - 1) + i;
}

int main(int argc, const char * argv[])
{
   
    int result = sum(3);
    printf("result = %d\n",result);
    return 0;
}

作者: fantacyleo    时间: 2014-7-12 21:59
BOOM 发表于 2014-7-12 21:38
比如这个 #include

int sum(int i)

递归,关键是把问题分解为规模较小但与原问题结构相同的子问题。比如设s(n) = 1+2+...+n。那么s(n)=(1+2+...+n-1) + n= s(n-1) + n,这就是return  sum(i - 1) + i;这条语句背后的思路。再比如递归算阶乘。设
f(n)=1*2*...*n,那么f(n)=(1*2*....*(n-1)) * n=f(n-1)*n,相应的递归语句就是:return f(n-1) * n
作者: 楠瓜果    时间: 2014-7-12 22:48
给你举个例子吧,猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第一天共摘多少个桃子。
  这个例子如果用回调函数,那先要确定几个思路:
1 猴子猜的桃是一个未知数,但是我们知道的是:到第10天的时候,桃子还剩下1个
2 每天都会吃掉前一天的一半零一个,那就是n=n/2+1,因为我们知道了第十天的剩余量,所以我们可以倒着来计算
  第十天的量,n为桃子的总数量。n=(n+1)+1*2;
那利用回调函数就是
int fun(int n){
   
    if (n == 10) {
        return 1;
    }
    return (fun(n +1) + 1 ) * 2;
}

然后在main函数中再进行调用就可以。

其实回调函数你只需要确定两个意思就可以。
1、找出fun(n) 与 fun(n -1)、fun(n - 2) 之间的关系,如果找不到这样的关系,就说明它不可以使用回调函数
2、确定什么时候返回一个确定值

作者: mybdgw    时间: 2014-7-12 22:56
今天上课讲的。。就是递归调用。。
作者: ★Joean_Zhou    时间: 2014-7-13 10:38
递归主要就是找规律
作者: 且行且惜    时间: 2014-7-13 10:55
如果说递归的话,好好了解一下循环,递归就是一个一个循环的过程!
作者: Moebius    时间: 2014-7-13 18:18
递归有点像高中数学的数列,数列概念理解,这个就没啥问题。
作者: 小海    时间: 2014-7-13 21:12
递归就是自己搞自己,关键要确定好结束条件和返回值模型




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2