【问题标题】:Exponential function in C using recursion function使用递归函数的 C 中的指数函数
【发布时间】:2017-05-07 20:06:58
【问题描述】:

我正在尝试用递归函数计算 x 的指数函数。指数函数是从 this equation 计算出来的。

我将指数函数分为两部分,第一部分是Fracture

(我用底部的递归函数计算出来,然后把这部分放在main函数的while循环中,求0到N的总和

由于我是 c 初学者,我的英语并不完美,请用简单的方式解释我的错误。

提前致谢.....

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>

double faktoriyel(double x,double N);

int main(){
    double N, x, a;
    double s = 0;
    scanf("%lf", &x);
    scanf("%lf", &N);
    a = N;
    do
    {
        s += faktoriyel(x, N);
        --a;
    }while (a > 0);
    printf("\n%lf\n", s);
}

double faktoriyel(double x, double N)
{
    if (N < 0)
        return -1;
    else if (N < 2)
        return pow(x, N) / 1;
    else
        return (pow(x, N) / N * faktoriyel(x, N - 1));
}

【问题讨论】:

  • 看不到必要的图像。请正确发布您的问题。
  • @GAURANGVYAS:该网站的新用户不能发布图片。总的来说,图像并没有真正受到鼓励,但责怪新人没有让它们可见是不公平的。
  • 请注意,您发布的等式中有一个错误(x 平方项的除数错误;它应该是 2!而不是 1!)。昨天也有人(可能是你;鉴于在两者中都使用了函数名称faktoriyel,可能是你)也发布了相同的(有问题的)方程式。

标签: c algorithm recursion


【解决方案1】:

您的基本情况不正确。 应该是

if(N == 0) return 1;

为什么,因为任何以 0 为幂的东西都是一。所以返回 0。

您的方法不是使用递归的正确方法。 检查此代码。

#include &lt;stdio.h&gt;

int power(int n1, int n2);

int main() { int base, powerRaised, result;

`printf("Enter base number: ");`
`scanf("%d",&base);`

`printf("Enter power number(positive integer): ");`
`scanf("%d",&powerRaised);`

`result = power(base, powerRaised);`

`printf("%d^%d = %d", base, powerRaised, result);`
`return 0;`

}

int power(int base, int powerRaised)

{ if (powerRaised != 0)

    `return (base*power(base, powerRaised-1));`
`else`
    `return 1;`

}

【讨论】:

    【解决方案2】:

    我在这里稍微改了一下:

    double faktoriyel(double x,double N) 
    {
    if (N == 0) return 1;
    else return (x/N * faktoriyel(x,N-1));
    }
    

    为什么?因为你写了

    return (pow(x, N) / N * faktoriyel(x, N - 1));
    

    导致计算 (x^(N+(N-1)+.....+1))/(N!) 而不是 x^N/N!。

    那是因为你每次调用函数都会重新计算 x^N 然后相乘:

    (x^N)(x^(N-1))....*1

    这里:

    do 
    {  
    s+=faktoriyel(x,N);
    --N;                        
    }while (N>=0);                
    

    而不是这个:

    do
    {
        s += faktoriyel(x, N);
        --a;
    }while (a > 0);
    

    因为你实际计算过

    x^N/N! + x^N/N! +.....+x^N/N!

    而不是:

    x^N/N! + x^(N-1)/(N-1)! +.....+1;

    递减 'a' 不会递减 N,结果是 在 e^x 的错误计算中。

    顺便说一句,它应该可以工作。

    【讨论】:

    • 非常感谢您的帮助,结果更准确但仍然不正确,如果我输入 x=1.23 和 N=23 我应该有 exp(1.23)=3.41229536 但它给了我2.42312
    • 我写了 N!=0 而不是 N>=0;我的错。它导致结果比所需结果少 1
    猜你喜欢
    • 1970-01-01
    • 2013-04-21
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多