我在生成Terras数字序列时遇到问题。



这是我失败的尝试:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Terras
{
    class Program
    {
        public static int Terras(int n)
        {
            if (n <= 1)
            {
                int return_value = 1;
                Console.WriteLine("Terras generated : " + return_value);

                return return_value;
            }
            else
            {
                if ((n % 2) == 0)
                {
                    // Even number
                    int return_value = 1 / 2 * Terras(n - 1);
                    Console.WriteLine("Terras generated : " + return_value);

                    return return_value;
                }
                else
                {
                    // Odd number
                    int return_value = 1 / 2 * (3 * Terras(n - 1) + 1);
                    Console.WriteLine("Terras generated : " + return_value);

                    return return_value;
                }
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("TERRAS1");
            Terras(1); // should generate 1

            Console.WriteLine("TERRAS2");
            Terras(2); // should generate 2 1 ... instead of 1 and 0

            Console.WriteLine("TERRAS5");
            Terras(5); // should generate 5,8,4,2,1 not 1 0 0 0 0

            Console.Read();
        }
    }
}


我究竟做错了什么?

我知道递归的基础知识,但我不明白为什么这样做不起作用。

我观察到该序列的第一个数字实际上是您传入的数字,随后的数字为零。

最佳答案

1 / 2 * Terros(n - 1);更改为Terros(n - 1)/2;

1 / 2 * (3 * Terros(n - 1) + 1);(3 * Terros(n - 1) + 1)/2;

1/2 * ...是具有0 * ...数学的int



[编辑]

递归是错误的,公式是错误的。简单迭代

public static void Terros(int n) {
  Console.Write("Terros generated :");
  int t = n;
  Console.Write(" " + t);
  while (t > 1) {
    int t_previous = t;
    if (t_previous%2 == 0) {
      t = t_previous/2;
    }
    else {
      t = (3*t_previous+1)/2;
    }
    Console.Write(", " + t);
  }
  Console.WriteLine("");
}


“ n为偶数”应为“ t(下标n-1)为偶数”-与“ n为奇数”相同。

08-04 12:45