2017-02-12 38 views
1

我是C++的初學者,代碼是作業的一部分。我遇到了程序無限循環的問題。我知道無限循環發生在序列(n)中,但我不明白爲什麼它是無限循環。我已經逐步評估了這個過程,但我似乎錯過了一些東西。如何修復簡單C++函數中的無限循環?

例:有問題的我面臨:N = 7,序列打印:7 22 22 22 22 22

#include <cstdio> 
using namespace std; 

// next(n) returns the value that follows n in the hailstone sequence. 
// Example: next(7) = 22, next(22) = 11, etc. 
// Since the hailstone sequence ends at 1, n is required to be > 1. 

int next (int n) 
{ 
    while (n > 1) 
    { 
    if (n%2 == 0) 
    { 
     return n/2; 
    } 
    else 
    { 
     return 3*n+1; 
    } 
    } 
    return 1; 
} 

// sequence(n) executes next(n) in a loop to print the next integer(s) 
// in the hailstorm sequence, starting from n until ending with 1. 

void sequence(int n) 
{ 
    int nextNum = n, x = next(nextNum); 
    while (nextNum > 1) 
    { 
    printf("%i", nextNum); 
    nextNum = x; 
    break; 
    } 
    if (nextNum == 1) 
    { 
    printf("%i", 1); 
    } 
} 

int main() 
{ 
    int n; 
    printf("Enter n: "); 
    scanf("%i", &n); 

    sequence(n); 

    return 0; 
} 

回答

2

考慮以下幾點:

while (nextNum > 1) 
{ 
    printf("%i", nextNum); 
    nextNum = x; 
    break; 
} 

這裏,x從不改變。因此,nextNum也永遠不會改變。這使循環無論執行還是完全不執行。

您的意思是叫next()體內循環,不會

另外請注意,while (n > 1)next()是一個無操作,因爲循環的主體總是returns

+0

該行應該等於nextNum = next(nextNum),當next()返回一個值時nextNum不會改變嗎? –

+0

@MTee *但它不是*。僅僅因爲你在聲明中放置了'x = next(nextNum)'並且''x'的初始化*並不意味着處處出現'x',因此今後相當於替換表達式'next(nextNum)'。 'x'不是一些預處理宏。這是一個變量。 – WhozCraig

+0

啊,這是一個很好的見解。你可能會認爲'while ='語句'x = next(nextNum)'的行可能意味着「每次我引用x我希望它是下一個(nextNum)」,但事實並非如此!你只是說你*用'next(nextNum)'的值初始化*'x'。從那時起,'x'將總是*是你首先初始化的那個值,除非你將它改變爲別的東西。重要的是,'='沒有**不**意味着平等,這意味着**賦值**。 – rwols

-1

實際上,您可以使用此代碼來生成冰雹序列。

#include <cstdio> 
using namespace std; 
int main() 
{ 
    int n; 
    printf("Enter n: "); 
    scanf("%i", &n); 

    printf("%i\t",n); 
    while(n>1) 
    { 
    if(n%2==0) 
    { 

     n=n/2; 
    } 
    else 
    { 

     n=(3*n)+1; 
    } 

    printf("%i\t",n); 

} 

    return 0; 
} 
+0

不好回答。其他提高他們的剪切和粘貼技能,OP從中學到了什麼?至少解釋你做了什麼以及爲什麼。 – user4581301

+0

我有具體的指導方針,所以我不會使用它。感謝壽。 –

+0

那麼現在在這個代碼中有什麼可以理解的呢?它從n運行一個循環,直到n變成1。在循環內改變n的值。在生成新的n值後,它被打印到控制檯。 –

0

首先作爲@NPE暗示關於nextNum在while循環中不變更值。您可以直接指定nextNum的值,而不使用變量x。

第二件事是,你爲什麼在循環中使用break聲明。 你可以寫如下: -

while (nextNum > 1) 
{ 
    printf("%i", nextNum); 
    nextNum = next(nextNum); 
} 

現在nextNum將在循環的每個迭代有新的價值。 希望這會幫助你。 :-)

+0

對不起,** break **聲明在那裏,所以我實際上可以看到終端中的輸出。另外,我的教授不鼓勵循環中的回調,這就是爲什麼我最初在變量** x **中擁有** nextNum **的原因。 –

+0

在循環之外保留回調是一種很好的做法。但是在這裏你的循環條件取決於這個回調,所以你必須把它放在循環中。 – Ashu

+0

@M Tee break語句不是要查看終端上的輸出,請使用打印命令。 ** break **語句用於終止循環,因此如果在此循環中放置** break **,則只有一次迭代可以工作。 – Ashu