我有以下任务:



我写了一个程序,编译时没有错误,但是当我启动程序并输入一个值时,出现错误,提示“堆栈溢出”。我想我的递归函数变成了无限,但我不知道如何用其他方式编写它。

这是我的代码:

#include <iostream>
using namespace std;
int powpow(int number);

int main(){
    cout<<"Enter number:";
    int x;
    cin>>x;
    cout<<"The result of ("<<x<<" * "<<x<<") * "<<x*x<<" is: "<<powpow(x);
    system("pause");
    return 0;
}
int powpow(int number){
    int result = number*number;
    return powpow(result);
}

最佳答案

您没有递归的终止条件,因此它将永远运行。

听起来您可能对递归没有很好的了解,所以我想从更简单的内容Fibonacci sequence开始。

每当我们根据递归定义函数时,都需要首先定义一个基本案例。就斐波那契而言,我们有2个基本案例:

F(0) = 0
F(1) = 1

也就是说,用英语来说,“F为0为0,F为1为1”。更简单地说,如果将0传递给函数F,我们将获得0。如果我们通过1,我们将得到1。

一旦定义了基本案例,就需要寻找一个递归关系。对于斐波那契,我们有以下重复发生的情况:

F(n)= F(n-1)+ F(n-2)

因此,对于n >= 2,我们可以使用上面的重复。为什么?好吧,让我们尝试n = 2。
F(2) = F(n-1) + F(n-2)
     = F(1) + F(0)
     = 1    + 0
     = 1

因此,现在我们知道F(2)的答案为1。此外,我们现在可以计算F(3)的答案。为什么?那么,我们需要什么来计算F(3)?我们需要F(2)和F(1)。由于F(1)是基本情况,我们现在有了这两个答案,而我们刚刚解决了上面的F(2)。

因此,现在让我们尝试编写一段伪代码来解决F。
function F(int n) {
  // handle base cases
  if (n equals 0)
    return 0
  if (n equals 1)
    return 1

  // recurrence
  return F(n-1) + F(n-2);
}

请注意,在递归函数中,我们总是在函数开始时处理基本情况。如果没有适当的基本案例,则无法定义此重复发生,否则,我们将没有终止条件。因此,您总是将基本案例放在函数的开头处。

现在,根据以上说明,另一个好的练习是为factorial function编写一个递归函数。因此,请按照下列步骤操作:
1. Define the base case (use wikipedia article for hints).
2. Define recurrence in terms of base case
3. Write pseudo code to solve the recurrence, and be sure to put base case(s) at beginning of function, and recurrence at end.

一旦掌握了这些步骤,那么继续进行功率恢复对您来说就更有意义了。

10-04 22:00
查看更多