将函数参数详细说明为静态变量

时间:2017-10-20 15:58:15

标签: c

我想知道如何使函数将给定参数视为静态变量。例如,我试图生成底层数字,但没有成功:

#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进行操作,从而无休止地进行,永远不会到达案例库。

几个问题:

  1. 这个想法是否代表了解决问题的可行方法?
  2. 这个想法是否代表合理/有效解决问题的方法?
  3. exit(0)在类似情况下是否正确使用?

2 个答案:

答案 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);
}