C-如何递归递增?递归判断素数的例子

C-How to increase in recursion?An example of recursively judging prime numbers

我是一个还没入门的编程菜鸟。刚学递归,递归的使用有一些问题。有一个作业是判断素数:使用int prime(int x);和return布尔值。

最初发现是因为变量是在函数内部初始化赋值,所以程序无法实现自增。因为每进入一个新的递归层次,变量都会被重新赋值。即使写了变量自增语句,也只会自增当前递归栈中存储的变量。一旦变量进入新的递归层次,变量只是按照定义初始化,不能连续自增。

失败的解决方法如下:

#include <math.h>
#define false 0
#define true  1

int prime(int x){
double high=sqrt(x);
int low=2;

if((x%low==0 && x!=2) || low>high){
    return false;
}
else if(x<2){
    return false;
}
else{
    return true;
}

low++;
return prime(x);
}

在提问时,我找到了一个成功的解决方案:

#include <math.h>
#define false 0
#define true  1

int prime(int x){
double high=mysqrt(x);
static int low=2;

if((x%low==0 && x!=2)||low>high){
    return false;
}
else if(x<2){
    return false;
}
else{
    return true;
}

low++;
return prime(x);

}

但是我无法理解为什么在进入新的一层递归时使用static修饰变量可以使变量正确递增而不是执行之前的int low=2;

求高手帮我解惑,内存中的那两个是怎么回事space?

另外好像还有一个解决办法,好像是设置一个flag变量,但是没看懂。有人可以提供其他解决方案吗?

简而言之,普通变量 (int low;) 为每个函数调用独立创建,而静态变量 (static int low = 2;) 只创建一次并在所有函数之间共享。

但是,static 并不是在这种情况下使用的最佳方法,因为不同的函数调用可能需要具有不同的 high/low.

相反,您可以向函数添加显式参数,例如(算法错误,但这是一般原则):

int prime(int x) { return prime_impl(x, 2, sqrt(x)); }

int prime_impl(int x, int low, double high) {
  if(x<2) {
      return false;
  }
  else if((x%low==0 && x!=2)||low>high) {
      return true;
  }
  else {
      return prime_impl(x, low+1, high);
  }
}