考拉兹猜想的变体

“考拉兹猜想”是一个数学上的未解之谜。

考拉兹猜想
对自然数 n 循环执行如下操作。

  • n 是偶数时,用 n 除以 2
  • n 是奇数时,用 n 乘以 3 后加 1
    如此循环操作的话,无论初始值是什么数字,最终都会得到 1(会进入1 → 4 → 2 → 1 这个循环)。

这里我们稍微修改一下这个猜想的内容,即假设初始值为偶数时,也用 n 乘以 3 后加 1,但只是在第一次这样操作,后面的循环操作不变。而我们要考虑的则是在这个条件下最终又能回到初始值的数。
譬如,以2为初始值,则计算过程如下。
2?→?7?→?22?→?11?→?34?→?17?→?52?→?26?→?13?→?40?→?20?→?10?→?5?→ 16?→?8?→?4?→?2
同样,如果初始值为4,则计算过程如下。
4?→?13?→?40?→?20?→?10?→?5?→?16?→8?→?4
但如果初始值为6,则计算过程如下,并不能回到初始值6。
6?→?19?→?58?→?29?→?88?→?44?→?22?→?11?→?34?→?17?→?52?→?26?→?13 →40?→?20?→?10?→?5?→?16?→?8?→?4?→?2?→?1?→?4?→?…



问题
求在小于 10000 的偶数中,像上述的 2 或者 4 这样“能回到初始值的数”有多少个。


package main

import "fmt"

func collatz(n int)bool{
    m := n * 3 + 1
    for{
        if m == 1{
            return false
        }else if m == n{
            return true
        }

        if m % 2 == 1{
            m = m * 3 + 1
        }else if m % 2 == 0{
            m = m / 2
        }
    }
}

func main(){
    var s []int
    for i:=2;i<10001;i+=2{
        if collatz(i){
            s = append(s, i)
        }
    }
    fmt.Println(s)
    fmt.Printf("共 %d 个数\n", len(s))
}


结果:

[2 4 8 10 14 16 20 22 26 40 44 52 106 184 206 244 274 322 526 650 668 790 866 976 1154 1300 1438 1732 1780 1822 2308 2734 3238 7288]
共 34 个数


本来用递归函数,发现有些麻烦,就用了for循环,发现很容易就搞定了,只需注意跳出循环的条件设计就好。

原文地址:http://blog.51cto.com/johnnyloo/2137372

时间: 2024-12-09 12:17:15

考拉兹猜想的变体的相关文章

关于考拉兹猜想的一个延拓

考拉兹猜想,又称为3n+1猜想.角谷猜想.哈塞猜想.乌拉姆猜想或叙拉古猜想,是指对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1.考拉兹猜想,亦可以叫"奇偶归一猜想". 在1930年,德国汉堡大学的学生考拉兹,曾经研究过这个猜想,因而得名. 在1960年,日本人角谷静夫也研究过这个猜想,但这猜想到目前,仍没有任何进展. 保罗·艾狄胥就曾称,数学上尚未为此类问题提供答案,他并称会替找出答案的人奖赏500元. 考拉兹猜想,验证 例如,

考拉兹猜想,

#考拉兹猜想(英语:Collatz conjecture),又称为奇偶归一猜想.3n+1猜想. #冰雹猜想.角谷猜想.哈塞猜想.乌拉姆猜想或叙拉古猜想,是指对于每一个正整数, #如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1. def collatz(number): int(number) if number % 2 ==0: return number/2 else : return 3 * number +1 try: num = int(input

Python练习题 042:Project Euler 014:最长的考拉兹序列

本题来自 Project Euler 第14题:https://projecteuler.net/problem=14 ''' Project Euler: Problem 14: Longest Collatz sequence The following iterative sequence is defined for the set of positive integers: n → n/2 (n is even) n → 3n + 1 (n is odd) Using the rule

从头认识java-18.2 基本的线程机制(6)-使用构造器或者内部类来实现多线程的编码变体

这一章节我们来讨论一下使用构造器或者内部类来实现多线程的编码变体. 1.基础实现 package com.ray.ch17; public class Test { public static void main(String[] args) { Thread thread1 = new ExtendsThread(); thread1.start(); Thread thread2 = new Thread(new ImplRunnable()); thread2.start(); } } c

变体(协变与逆变)

变体的引入是为了提高泛型类型的变量在赋值时可以对类型进行兼容性转换,以扩展泛型的灵活性.下面看个例子: public delegate void DoWork<T>(T arg); ........ DoWork<A> del1=delegate(A arg){//.......}; DoWork<B> del2=del1; B bb=new B(); del2(bb); 其中A ,B是两个类,B类继承A类,即:public class A{.....}        

labview 变体

变体数据类型是LabVIEW中多种数据类型的容器.将其它数据转换为变体时,变体将存储数据和数据的原始类型,保证日后可将变体数据反向转换. 例如,如将字符串数据转换为变体,变体将存储字符串的文本,以及说明该数据是从字符串(而不是路径.字节数组或其它LabVIEW数据类型)转换而来的信息. 变体函数可用于创建和操作变体数据.可将平化数据和LabVIEW数据转化为变体数据,或将变体数据转化为LabVIEW数据. 变体数据类型可存储数据的属性.属性是定义的数据及变体数据类型所存储的数据的信息. 例如,如

Android Studio下项目构建的Gradle配置及打包应用变体

Gradle简介 ??Gradle是一个自动化构建工具,采用Groovy的Domain Specific Language(领域特定语言)来描述和控制构建逻辑.具有语法简洁.可读性强.配置灵活等特点.基于Intellij IDEA社区版本开发的Android Studio天生支持Gradle构建程序.Groovy是一种基于JVM的敏捷开发语言,结合了Phthon.Ruby和Smalltalk的许多强大特性.同时,Groovy代码既能够与java代码很好地结合,也能够用于扩展现有的代码. Grad

(转) 干货 | 图解LSTM神经网络架构及其11种变体(附论文)

干货 | 图解LSTM神经网络架构及其11种变体(附论文) 2016-10-02 机器之心 选自FastML 作者:Zygmunt Z. 机器之心编译  参与:老红.李亚洲 就像雨季后非洲大草原许多野生溪流分化成的湖泊和水洼,深度学习已经分化成了各种不同的专门架构. 并且,每个架构都会有一个图解,这里将详细介绍它们. 神经网络在概念上很简单,并且它们十分动人.在层级上,有着一堆同质化的元素和统一的单位,并且它们之间还存在在一系列的加权连接.这就是神经网络的所有,至少从理论上来说是这样.然而,时间

5.2 vector: 创建和使用vector的各种变体

Clojure练习-5.组合数据类型 "用100个函数来操作一个数据结构比10个函数操作10个数据结构要好很多.基于一个统一的数据结构,我们可以构建出一系列的小函数,这些小函数又可以组合起来形成一个强大的系统.而为不同的数据结构编写不同的函数,在根本上就削减了复用的可能." -- [ Alan Perlis ] Clojure练习-5组合数据类型 组合数据类型 2 vector 创建和使用vector的各种变体 已知 解1 测试 解2 测试 5. 组合数据类型 5.2 vector: