我想知道如何使函数将给定参数视为静态变量。例如,我试图生成底层数字,但没有成功:
#include<stdio.h>
int hailstone(int);
int n; /* n is an extern variable*/
int main(){
hailstone(n);
return 0;
}
int hailstone(int n){
static int m = n; /*not possible because n is not constant*/
if(m % 2 == 0 && m != 1)
hailstone(m /= 2);
else if(m != 1)
hailstone((m *= 3) + 1);
else
exit(0); /*Is the use of exit() correct, in this case?*/
return 0;
}
我想使用静态变量来详细说明n。否则,每个递归调用都将对整个参数n
进行操作,从而无休止地进行,永远不会到达案例库。
几个问题:
exit(0)
在类似情况下是否正确使用?答案 0 :(得分:3)
您不需要静态变量。只需传入新值即可进行操作并使用它。此外,值1是您的基本情况,因此请检查以停止递归,并打印n
的值,以便您可以实际查看正在进行的操作。
void hailstone(int n){
printf("n=%d\n", n);
if(n % 2 == 0 && n > 1) {
hailstone(n/2);
} else if(n > 1) {
hailstone((n*3) + 1);
}
}
鉴于此函数可能会进行相当多的迭代,递归解决方案可能最终导致堆栈溢出。最好采用迭代解决方案:
void hailstone(int n){
while (n > 1) {
printf("n=%d\n", n);
if(n % 2 == 0) {
n = n/2;
} else {
n = (n*3) + 1;
}
}
}
答案 1 :(得分:1)
这里是冰雹的递归算法,不需要static
#include <assert.h>
#include <stdio.h>
void hailstone(unsigned int n)
{
assert(n>0);
printf("%u\n", n);
if ( n == 1 )
return;
if( n & 1 ) {
hailstone(3*n + 1);
}
else {
hailstone(n >> 1);
}
}
int main() {
hailstone(5);
}