C 用递归法求幂函数

C 用递归法求幂函数,c,recursion,math,exponent,C,Recursion,Math,Exponent,实现应该使用递归计算一个n次方的数字,但是,每次对自身的调用都保持“nb”不变,而幂递减。我尝试过使用累加器变量,但每次重复调用都会重新初始化为默认值。有没有一种方法可以在不添加额外参数的情况下将nb*nb保存到nb?还是失去了基本价值 当我运行ft_递归_电源时(3,10);在c可视化工具(ctutor)中,并将这些参数传递给它,它显示nb在整个执行过程中保持3,并返回177147,而它应该累积乘法并返回59049。还是我遗漏了什么 int ft_recursive_power(int n

实现应该使用递归计算一个n次方的数字,但是,每次对自身的调用都保持“nb”不变,而幂递减。我尝试过使用累加器变量,但每次重复调用都会重新初始化为默认值。有没有一种方法可以在不添加额外参数的情况下将nb*nb保存到nb?还是失去了基本价值

当我运行ft_递归_电源时(3,10);在c可视化工具(ctutor)中,并将这些参数传递给它,它显示nb在整个执行过程中保持3,并返回177147,而它应该累积乘法并返回59049。还是我遗漏了什么

int   ft_recursive_power(int nb, int power)
{
  // 0 to the 0th case
  if (power == 0 && nb == 0)
    return (1);
  // recursive case
  if (power > 0)
    return (nb * ft_recursive_power(nb, power - 1));
  return (nb);
}
这里是您的问题:

if (power == 0 && nb == 0)
应该由

if (power == 0)
并添加了案例(nb==0)

如果(nb==0)

该函数应该也适用于负功率,因此我建议将返回类型更改为float

这是我的解决方案:

float   ft_recursive_power(int nb, int power)
{
    // 0 to the 0th case
    if (power == 0)
        return 1;
    if (nb == 0)
        return 0;

    // recursive case
    // power is positive
    if (power > 0)
        return (nb * ft_recursive_power(nb, power - 1));

    // mean power is negative
    else
        return (ft_recursive_power(nb, power + 1) / nb);
}

你得到的结果不正确,因为你的基本情况是错误的

177147的值是311,而不是310,这意味着你要再乘以一次。这是因为当
power
为0时,在基本情况下返回nb

当将一个数字提高到0次方时,结果是1,因此基本情况应该是1

int   ft_recursive_power(int nb, int power)
{
  // 0 to the 0th case
  if (power == 0 && nb == 0)
    return 1;
  // recursive case
  if (power > 0)
    return nb * ft_recursive_power(nb, power - 1);
  return 1;
}

为什么要“保存nb*nb到nb”?代码本身似乎运行良好。最后一行应该是
return1,但它在其他方面是好的。”[E]对自身的调用,使“nb”保持不变,而功率递减”——为什么是这样,这是一种非常有效的方法。事实上,这比你想象的要干净。连续乘法是在返回端执行的。我不确定您是否完全理解递归或函数中局部变量(包括参数)的行为。当此函数递归时,每个调用中的
nb
的每个实例都是独立的。如果另一个实例更改其
nb
,则调用链中函数的第一个实例不会丢失其
nb
的值。而且,对于这么简单的函数,没有理由保留任何类型的累加器。每个函数只能使用一个简单的表达式来计算它需要返回的值:
nb*ft\u recursive\u power(nb,power-1)
在一般情况下。因此,既然有一个简单的表达式可以工作,为什么还要添加更多的代码来更改
nb
?正如dbush所指出的,唯一的错误是函数在基本情况下返回的值:当power`为零时(而
nb
不是),代码将进入
return(nb)。但是nb**0是1,而不是nb,因此在这种情况下函数应该返回1。解决这个问题,例行程序就会工作。删除
返回(nb)power<0
语句会导致未定义的行为,因为它从末尾掉下来。@Peter是的,我们应该关心power是否为负吗?在这种情况下,返回值(nb)也不正确。对于
ft\u递归功率(0,1)
,返回1,但0**1是0。您所说的应该更改的
(power==0&&nb==0)
正在处理特殊情况0**0,这是正确的,尽管可以更优雅地处理它。指出这是问题所在是不正确的。@Loc Tran-鉴于
power
的类型为
int
,它可以是负数。由于无法阻止调用方传递负值,因此最好以某种方式处理这种情况,而不是引入未定义的行为。调用
exit()
(其行为已明确指定,即使用户不满意),也比具体引入未定义的行为要好得多,因为未定义的行为几乎可以做任何事情,包括破坏主机系统、毒害程序使用的数据、重新格式化硬盘驱动器、,等等。我认为应该改变浮动的返回类型。这样做会将函数从一个提供精确答案的函数(对于有限的输入)更改为一个提供近似答案的函数。