hailstone sequence c ++计算序列长度所需的函数。无限循环问题

时间:2018-02-08 03:37:55

标签: c++ algorithm loops

我需要编写一个函数来计算并返回先前在已经存在的函数中计算的冰雹序列的长度。 我尝试的一切都给了我一个无限循环的“22”。 不允许使用数组。一切都必须用循环完成,每个函数只有一个循环。

我大多尝试使用长度为++的前面的函数;添加到他们。 但我对于该做什么一无所知。

#include <cstdio>
using namespace std;

// The function next(n)takes an integer value n and 
// returns the number that follows n in a hailstone sequence. 
// For example: next(7) = 22 and next(22) = 11.

int next(int n)
{
  if (n > 1)
  {            
    if ((n % 2) == 0 )
    {
      n = n / 2;
    }
      else
      {
        n = 3 * n + 1;
      }
    printf("%i ",n); 

  }          
  return 0;
}

// The function hailstone reads int n and 
// prints its entire hailstone sequence.

void hailstone(int n)
{
  while(n>1)
  {
    next(n);
  }
} 

int length(int n)
{
  int length = 1;
  return length;
}

int main()
{
  int n; 

  printf("What number shall I start with?");
  scanf("%i", &n);

  printf("The hailstone sequence starting at %i is: ", n);
  hailstone(n);


  printf("The length of the sequence is: %i", length(n));

  return 0;
}

3 个答案:

答案 0 :(得分:1)

问题是您没有更改n值。试试这个:

int next(int n)
{
  if (n > 1)
  {            
    // As before
  }          
  return n;
}

注意return n;返回序列中的下一个值。接下来我们需要:

void hailstone(int n)
{
  while(n>1)
  {
    n = next(n);
  }
} 

我将其更改为n = next(n);,因此我们会在序列中选择新值。

此外,length可以通过以下方式计算:

int hailstone(int n)
{
  int length = 0;
  while(n>1)
  {
    n = next(n);
    length++;
  }
  return length;
} 

这会计算我们拨打next()的次数。

答案 1 :(得分:1)

首先,在hailstone的循环中,您不会修改n,因为next函数的参数是passed by value。您可以改为将next的参数更改为reference,或利用返回值,即

int next(int n)
{
    // ...       
    return n;
        // ^
}

并在循环中使用它来修改n

void hailstone(int n)
{
    while (n > 1)
    {
        n = next(n);
     // ^^^
    }
} 

其次,要计算长度,您应该在循环期间记录它,并再次利用返回值将长度信息传递给调用者。

unsigned hailstone(int n) // return type is changed to unsigned
{
    unsigned length = 0;
    while (n > 1)
    {
        n = next(n);
        ++length;
    }
    return length;
} 

然后您可以在main

中打印长度信息
printf("The length of the sequence is: %u", hailstone(n));

答案 2 :(得分:0)

函数next()将整数作为参数,并在调用函数时将该值复制到一个完全独立的变量中。这意味着对函数中变量的任何更改都对用于调用函数的变量完全没有影响。

你应该使用这样的引用:void next(int &n)(你将在后来的C ++旅程中学习参考),使用全局变量,或者,考虑到上下文,我认为最好只返回每次调用next()结束时,n的新值。只需用return 0;替换next()中的行return n;(不知道为什么你有一个函数返回一个整数,然后你刚刚返回0),然后使用这一行调用函数: n = next(n);

对于长度,你可以在函数hailstone()中有一个计数器变量,在循环中递增它,然后只返回长度。

新代码:

#include <cstdio>
using namespace std;

// The function next(n)takes an integer value n and 
// returns the number that follows n in a hailstone sequence. 
// For example: next(7) = 22 and next(22) = 11.

int next(int n)
{
  if (n > 1)
  {            
    if ((n % 2) == 0 )
    {
      n = n / 2;
    }
    else
    {
      n = 3 * n + 1;
    }
    printf("%i ",n);

  }          
  return n; //return the new value of n
}

// The function hailstone reads int n and 
// prints its entire hailstone sequence.

int hailstone(int n)
{
  int length = 0; //counter variable
  while(n>1)
  {
    n = next(n); //update n with the new value
    length++; //increment counter
  }
  return length; //return length to be used later
} 

int main()
{
  int n; 

  printf("What number shall I start with?");
  scanf("%i", &n);

  int length; //variable to store the length
  printf("The hailstone sequence starting at %i is: ", n);
  length = hailstone(n); //save the length from the function call

  printf("The length of the sequence is: %i", length);

  return 0;
}