当前位置:编程学习 > C#/ASP.NET >>

给大家出一个C#面试题,关于委托的

题目,求一个函数在某一点的导数。

要求用 C# 语法实现,函数和自变量都是不确定的。

提示,用到委托和一点点高等数学的知识。对于不清楚委托有什么用的人,也可以尝试不用委托实现。 --------------------编程问答-------------------- 这里是参考答案,在100楼以后公布。 --------------------编程问答-------------------- 精度要求如何呢? --------------------编程问答--------------------
引用 2 楼 colinfang2006 的回复:
精度要求如何呢?

任意。但是不可导的情况要能检测出来。 --------------------编程问答-------------------- 什么是导数?望得一干二静。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 卡,微积分的公式都忘完了, --------------------编程问答-------------------- 说清输入格式和输出格式啊 --------------------编程问答-------------------- 为什么只要是面试题,就会被论坛设置为推荐帖呢? --------------------编程问答-------------------- 导数微分啥的忘光光了
--------------------编程问答-------------------- 顶,求真相 --------------------编程问答-------------------- 你让没上大学的我情何以堪。 --------------------编程问答-------------------- 我只会写这个

        static double GetDerivative(Func<double> func, double position) {
            // 迭代法是最好的,求导数也可以迭代吗?
        }

--------------------编程问答-------------------- 导数公式里面是不是一推的圈圈叉叉的符号。 --------------------编程问答-------------------- 知道导弹,导数是啥 --------------------编程问答-------------------- 是不是加减0.0000....0000001
然后算左导数右导数
两边值&一阶导数差太多就不可导?

所谓委托就是搞个函数指针指向那个要被求导的函数? --------------------编程问答--------------------
引用 4 楼 mabaolin 的回复:
什么是导数?望得一干二静。


同道中人
--------------------编程问答-------------------- 委托实质上是函数指针,用委托的意思,就是将向求导函数传入两个参数,一个是待求导函数的指针,即在C#中声明为委托类型的函数,另一个值是求导位置,但是函数的自变量是什么类型呢? --------------------编程问答-------------------- 公式很简单
limit f'(x0)=(f(x0+dx)-f(x0))/dx
dx->0

问题时dx趋向0的时候不可靠了吧

f(x0+dx)与f(x0)几乎相同,受精度限制这个结果已经相当不可靠了啊
--------------------编程问答-------------------- 什么是导数啊? --------------------编程问答-------------------- 高中学了那么一丁点,没用过,全忘了 --------------------编程问答-------------------- 先顶后看~~~~~~~~~~~ --------------------编程问答-------------------- --! 这个LZ是在考数学么?
公式全还老师了  早不记得了、、、、 --------------------编程问答-------------------- 导数是什么?忘光了…… --------------------编程问答--------------------
引用 4 楼 mabaolin 的回复:
什么是导数?望得一干二静。

2的倒数就是1/2 --------------------编程问答-------------------- 委托就像CPP里面函数的指针 --------------------编程问答-------------------- 速度顶贴,坐等答案 --------------------编程问答-------------------- 有可能不可导,函数是否应该是
Func<double?> func
有可能函数在某些点上某有值呢(不连续)

还有,假如函数f(x)为正负根号x呢(x>=0) 也不可导吧 --------------------编程问答-------------------- 顶楼主,来学习 --------------------编程问答-------------------- 抛砖引玉

        static double GetDerivative(Func<double, double> func, double position) {
            double dx = 0.0001;
            while(true) {
                if(func(position + dx) - func(position) < 0.0001) break;
                dx /= 10;
            }
            return (func(position + dx) - func(position)) / dx;
        }

        static void Main(string[] args) {
            Console.WriteLine(GetDerivative(x => Math.Cos(x), 0));
            Console.WriteLine(GetDerivative(x => Math.Cos(x), Math.PI));
            Console.WriteLine(GetDerivative(x => Math.Cos(x), Math.PI/2));
            Console.WriteLine(GetDerivative(x => Math.Cos(x), 1));
        }

这个精度是在太低,这种精度下就不要搞什么不可导了 --------------------编程问答--------------------
引用 20 楼 ycm9987131 的回复:
委托实质上是函数指针,用委托的意思,就是将向求导函数传入两个参数,一个是待求导函数的指针,即在C#中声明为委托类型的函数,另一个值是求导位置,但是函数的自变量是什么类型呢?


不同意。初始学习可以这样认为,以便于和C++的函数指针对应,但是不能说这是“实质上”。 --------------------编程问答-------------------- 100楼太高,我帮忙盖点. --------------------编程问答-------------------- 这个也太。。哎。。。算了,看看热闹。 --------------------编程问答-------------------- 只能路过。。。。 --------------------编程问答-------------------- 100+下 --------------------编程问答-------------------- 哎,菜鸟路过,望大神指点
--------------------编程问答-------------------- 哎,菜鸟路过,望大神指点
--------------------编程问答-------------------- 哎,菜鸟路过,望大神指点
--------------------编程问答-------------------- 可惜我不会啊~~~ --------------------编程问答-------------------- 关注下! --------------------编程问答-------------------- 厉害,学习学习
--------------------编程问答-------------------- 我也来添砖加瓦。。。  求真理。。。 导数是什么? 干嘛用的? --------------------编程问答--------------------   设函数y=f(x)在点x0的某个邻域N(x0,δ)内有定义,当自变量x在x0处有增量△x(设x0+△x∈N(x0,δ)),函数y=f(x)相应的增量为△y=f(x0+△x)-f(x0).
  如果当△x→0时,函数的增量△y与自变量的增量△x之比的极限lim △y/△x=lim [f(x0+△x)-f(x0)]/△x存在,则称这个极限值为f(x)在x0处的导数或变化率.通常可以记为f'(x0)或f'(x)|x=x0. --------------------编程问答-------------------- 精度要求如何呢? --------------------编程问答-------------------- 我想应该是这样。求某点的导数可以,但是求导函数呢???
引用 18 楼 himetale 的回复:
是不是加减0.0000....0000001
然后算左导数右导数
两边值&一阶导数差太多就不可导?

所谓委托就是搞个函数指针指向那个要被求导的函数?
--------------------编程问答-------------------- 楼上没有将导数不存在的情况考虑进去吧!
引用 32 楼 icedmilk 的回复:
抛砖引玉

C# code

        static double GetDerivative(Func<double, double> func, double position) {
            double dx = 0.0001;
            while(true) {
                if(func(position + dx)……
--------------------编程问答-------------------- 路过................... --------------------编程问答-------------------- 初学者求解答……望大神指点…… --------------------编程问答-------------------- 学习了学习了 --------------------编程问答-------------------- kankan. --------------------编程问答-------------------- 1.算式转字符串(如"y=3x^2+2x+1")
2.字符串分析出("y'=6x+2")
3.再转算式
4.还是算了...

下面这个应该和32L一样的
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            double x = 2d;

            double y1 = LimFunc(Func1, x);
            double y2 = LimFunc(Func2, x);
            double y3 = LimFunc(Func3, x);

            Console.WriteLine("{0}\t{1}\t{2}", y1, y2, y3);
            Console.ReadKey();
        }

        delegate double FuncCallBack(double x);

        static double Func1(double x)
        {
            double y = x + 1;
            return y;
        }

        static double Func2(double x)
        {
            double y = Math.Pow(x, 3d) + Math.Pow(x, 2d) + x + 1;
            return y;
        }

        static double Func3(double x)
        {
            double y = Math.Sqrt(x - 3d);
            return y;
        }

        static double LimFunc(FuncCallBack f, double x)
        {
            double dx = 0.00001d;
            double y_ = (f(x + dx) - f(x)) / dx;
            return y_;
        }
    }
}
// 输出
// 1.00000000000655 17.0000700002504 非数字

--------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 顶帖!!!求真相! --------------------编程问答-------------------- 哎~~都忘记了 --------------------编程问答-------------------- http://baike.baidu.com/view/295773.htm --------------------编程问答-------------------- 啊,不会啊,学习~~~ --------------------编程问答-------------------- 自动微分是一个研究课题,目前还没有真正成熟的算法8?LZ用它做面试,有点太哪个了点。。。 --------------------编程问答-------------------- 为求答案,顶! --------------------编程问答-------------------- 数值积分/微分呗,不行的话还有级数展开呢。反正计算机都是离散数据,需求是求一个数,那不就是套用数值公式吗?考点其实就是一个字符串分析,提取数学式子,剩下都是加减乘除。 --------------------编程问答-------------------- 记号一个。。。 --------------------编程问答-------------------- 求答案~~~ --------------------编程问答-------------------- 帮顶一下……………… --------------------编程问答-------------------- 帮顶一下……………… --------------------编程问答-------------------- 帮顶一下……………… 
--------------------编程问答-------------------- 学习。 --------------------编程问答-------------------- 顶一下,对于微积分表示压力很大 --------------------编程问答-------------------- 本来就不是学的很好 现在忘光了 。。。。。。。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- 哎,导数,忘得是干干净净了。。。 --------------------编程问答-------------------- 路过,学习一下 --------------------编程问答-------------------- 对任意函数表达式f(x)可以自动求导啊,,,
牛X,,
--------------------编程问答-------------------- 基本思路应该是这样的
不确定的函数用委托代表了
导数为dy/dx  当dx无限接近0时就求出该导数

用程序让dx从左右两侧分别不断取更小的数值,然后计算dy/dx
比如用等比方法,每次变化为上一次的1/2或1/4或1/8
应该用demical类型,可以求出更准确的结果

如果结果超过某很大的数,认为是无穷
(也许可以通过求dx/dy为0判定为无穷)

如果前后两次结果变化逐渐逼近,甚至为0,则认为成功求出该导数

具体代码不写了

反正对于不确定函数,估计只能用这种笨办法了 --------------------编程问答-------------------- 关注中…… --------------------编程问答-------------------- 帮顶一下………………  --------------------编程问答-------------------- 路过! --------------------编程问答-------------------- 把函数表达式写成这样的函数:
f(double x)
{
  函数表达式
}
让一个指针指向这个函数,设为p;
求导方式为
derivative(void* p,double pos)
{
   求导数计算极限!!
}

求极限不会哟,计算方法那门课没学好哟,,
坐等大牛哟
--------------------编程问答-------------------- dx 无限接近0时    f(x)无限接近f(x+dx)
所以在有限的精度内无法求出
dy的值
当dx无限接近0时
dy=f(x+dx)-f(x)计算机会认为是0
所有函数的导数就都是0了(分段函数除外)。

引用 78 楼 charmingalgoman 的回复:
基本思路应该是这样的
不确定的函数用委托代表了
导数为dy/dx 当dx无限接近0时就求出该导数

用程序让dx从左右两侧分别不断取更小的数值,然后计算dy/dx
比如用等比方法,每次变化为上一次的1/2或1/4或1/8
应该用demical类型,可以求出更准确的结果

如果结果超过某很大的数,认为是无穷
(也许可以通过求dx/dy为0判定为无穷)

如果前后两次结果变化逐渐……
--------------------编程问答-------------------- 顶。求真相~~ --------------------编程问答-------------------- 层数,就是在无限接近某一个点时,x轴增量与y轴增量的比值。

如果是一元函数的话,可以说,就是这条直线的斜率 --------------------编程问答--------------------
引用 83 楼 icedmilk 的回复:
dx 无限接近0时 f(x)无限接近f(x+dx)
所以在有限的精度内无法求出
dy的值
当dx无限接近0时
dy=f(x+dx)-f(x)计算机会认为是0
所有函数的导数就都是0了(分段函数除外)。


引用 78 楼 charmingalgoman 的回复:
基本思路应该是这样的
不确定的函数用委托代表了
导数为dy/dx 当dx无限接近0时就求出该导数

用程序让d……

计算方法很多!直接求dy=f(x+dx)-f(x),明显是完蛋了,得用别的方法了,计算方法那门课里有很多思想,方程逼近,补偿,迭代等来计算函数值,不能简单直接计算f(x),那样肯定没戏,, --------------------编程问答--------------------
引用 27 楼 kwwwvagaa 的回复:
引用 4 楼 mabaolin 的回复:

什么是导数?望得一干二静。

2的倒数就是1/2

是求导不是倒数 --------------------编程问答-------------------- 你说的有道理
应当多加判断以避免这种情况的出现了

也许还有更巧妙的方法,需要再考虑考虑

引用 83 楼 icedmilk 的回复:
dx 无限接近0时    f(x)无限接近f(x+dx)
所以在有限的精度内无法求出
dy的值
当dx无限接近0时
dy=f(x+dx)-f(x)计算机会认为是0
所有函数的导数就都是0了(分段函数除外)。

引用 78 楼 charmingalgoman 的回复:
基本思路应该是这样的
不确定的函数用委托代表了
导数为dy/dx 当dx无限接近0时就求出该导数

用程序让……
--------------------编程问答-------------------- 哎...叹气一声,然后走人. --------------------编程问答-------------------- 学习学习 --------------------编程问答-------------------- 纠结  看不懂。 学习下。 --------------------编程问答--------------------
引用 12 楼 chrisak 的回复:
导数微分啥的忘光光了


没什么印象了 --------------------编程问答-------------------- 到底是C#面试题,还是数学家面试题。这和C#有什么必然联系么?除了那个“委托”…… --------------------编程问答-------------------- 帮顶一下把!!!!!!!! --------------------编程问答-------------------- 导数忘记了。 --------------------编程问答-------------------- 可能还是得用到计算方法里的,根据若干个己知函数点的值去近似拟合出原函数,再求导,,,还是拟合的思想吧,,坐等大牛哟,,坐等答案哟 --------------------编程问答-------------------- 函数有断点你怎么拟合?

拟合是处理离散函数的吧,根本不适用于这个问题

引用 96 楼 righthook8 的回复:
可能还是得用到计算方法里的,根据若干个己知函数点的值去近似拟合出原函数,再求导,,,还是拟合的思想吧,,坐等大牛哟,,坐等答案哟
--------------------编程问答-------------------- 既然是拟合,还管原函数有没有什么断点不断点,只是提个建议而己
拟合只是保证原函数过哪些点,拟合出来的函数也过那些点,并且其它非计算点的值两函数都很接近,导数可能相近---最后这一点是我的想法,完全可以反对,但你要说拟合只能处理离散----你也不是个好学生哟,上课走神了吧,出题者也没限定原函数是个什么情况哟,呵呵,
--------------------编程问答-------------------- 99楼 --------------------编程问答-------------------- 100 --------------------编程问答-------------------- dx为负,和dx为正
分别求出值
相差大的不可导 --------------------编程问答-------------------- 100不分页了?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,