【发布时间】:2015-01-02 00:02:27
【问题描述】:
假设我在 C 中有以下函数:
#include <stdio.h>
int sum(int n);
int main(){
int num,add;
printf("Enter a positive integer:\n");
scanf("%d",&num);
add=sum(num);
printf("sum=%d",add);
}
int sum(int n){
int temp;
temp += 2;
printf("Temp is : %i", temp);
if(n==0)
return n;
else
return n+sum(n-1); /*self call to function sum() */
}
我的问题是我只想在循环的第一级做temp += 2;。所以我希望它只对 sum 的第一个循环是本地的,而不是对所有被调用的 sum 函数本身。所以为了让问题更清楚一点:在递归函数中定义的变量是否仅在递归“树”的第一部分本地?很难解释我的问题,所以如果你不明白,请询问。谢谢!
编辑:在总和中添加了 printf。所以我想要的输出是: 温度是:2 温度是:2
但我认为会发生的是:
温度是:2 温度是:4 等等……
编辑 2:对于想要尝试硬代码的人,这里是:(我的问题实际上是,一旦声明 ar_in[i]+ space_fill == lw && used[i] == 0 为真,我想执行之后声明的所有内容 @ 987654324@语句,直到return 1;再一路返回到函数search_combi。注意:ar_in[]数组是几个数的数组,例如{10,80,70,60,80})
bool search_combi(int ar_in[], int index){
if (ar_in[index] == lw){
used[index] = 1;
comb[combcount][0] = index;
return 1;
} else{
tempcomb[0] = index;
tempcombcount++;
space_fill = ar_in[index];
//search right of element
search_right(index+1, ar_in);
return 0;
}
}
int search_right(int start, int ar_in[]){
int i, j;
int temp_space_fill = space_fill;
printf("Tempspace = %i \n", temp_space_fill);
if(choose == 1) {
choose = 0;
return 1;
}
if(start == cn){
return 1;
}else{
for(i = start; i < cn; i++){
space_fill = temp_space_fill;
if(choose == 1) {
break;
}
if (ar_in[i] + space_fill == lw && used[i] == 0){
tempcomb[tempcombcount] = i;
for(j = 0; j <= tempcombcount; j++){
comb[combcount][j] = tempcomb[j];
used[tempcomb[j]] = 1;
}
combcount++;
memset(tempcomb, 0 , sizeof(tempcomb));
tempcombcount = 0;
space_fill = 0;
temp_space_fill = 0;
choose = 1;
return 1;
} else if (ar_in[i] + space_fill < lw && used[i] == 0){
space_fill += ar_in[i];
tempcomb[tempcombcount] = i;
tempcombcount++;
}
search_right(i+1, ar_in);
}
}
return 1;
}
【问题讨论】:
-
您的代码中未使用此局部变量。所以举一个你确实需要一个局部变量的例子。
-
和
int temp; temp +=2;嗯。你认为你要添加什么2到? -
局部变量 'temp' 未初始化为任何值。使用未初始化的变量执行数学运算是未定义的行为。
标签: c function variables recursion scope