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);
}
}
我是一个还没入门的编程菜鸟。刚学递归,递归的使用有一些问题。有一个作业是判断素数:使用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);
}
}