2017-10-20 36 views
1

我想知道如何讓一個函數考慮一個給定的參數作爲一個靜態變量。例如,我試過,沒有成功,生成hailstone號碼:精心設計一個函數參數作爲靜態變量

#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

'靜態INT米;然而,m = n;'是可能的。 – Bathsheba

+3

在遞歸函數中使用全局變量會挫敗遞歸的重點,所以您肯定需要重新考慮您的解決方案。在任何情況下,你的函數都不會顯示任何基本情況(除0以外,無法達到)。在你看來,基本情況是什麼?爲什麼你認爲遞歸不能達到它? – rici

+0

@ricie,是不是'm <1'表示的案例庫?也許,因爲最終的結果應該是1,'m == 1'可能是更好的基本情況,你是對的。另外,我正在徘徊在如何超越全球變量的問題上。 – Worice

回答

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; 
     } 
    } 
} 
+0

感謝@rici評論我調整了案例庫,謝謝。 – Worice

+1

我會對你的代碼做一點練習。感謝這個雙重例子。遞歸對我來說仍然不是那麼直觀,因此能夠將它與迭代方法進行比較是非常有用的。 – Worice

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); 
} 
+0

感謝你的例子,它給了我一個很好的洞察問題! – Worice