双阶乘是什么(双阶乘是什么意思)



一、阶乘函数

数学上,尤其是组合数学,有一个相当常用的函数叫做阶乘(Factorial)。阶乘函数的参数是一个自然数,它会返回1与此数之间所有数的乘积。比如,6的阶乘是 1 × 2 × 3 × 4 × 5 × 6 = 720 。这相当有趣,因为对我们来说,它可以用一种递归函数来表示。

ELM榆木语言是函数式编程语言,函数式编程没有循环命令,用递归实现循环,下面的榆木的代码:

import Debugimport Html exposing (text)factorial n =        case n of                 0 ->               1                 _ ->              n*factorial (n-1) main = text <| Debug.toString <| factorial  6

显示结果为 720

二、双阶乘

双阶乘意为:从1(或2)隔一个数字乘一个,一直乘到n。比如,8的双阶乘是 8 × 6 × 4 × 2 = 384,

7的双阶乘是 7 × 5 × 3 × 1 = 105. 下面用榆木实现一个双阶乘函数doublefactorial.

import Debugimport Html exposing (text)doublefactorial n =   case n of      0 ->        1      1 ->        1      _ ->        n*doublefactorial (n-2)main = text <| Debug.toString <| doublefactorial  7

显示结果为 720



三、汉诺塔问题

三根柱子。在一根柱子上,从上到下,由小到大叠放着64个盘子。要把这些盘子搬到另一根柱子上。规则是:一次只能移动一个圆盘。大盘不能叠在小盘的上面。问:移动次数最小的方案?

先用榆木语言实现:

import Debugimport Html exposing (text)hanota : Int -> Inthanota n =   case n of      1 ->        1      _ ->        hanota (n-1)*2+1   --注:分解为子问题再递归 main = text <| Debug.toString <| hanota 10

显示为 1023

再用python语言实现:

a = "a"b = "b"c = "c"def hannota(n,a,b,c):    count = 0        if n == 1:                return 1     count   = hannota (n-1,a,c,b) + count     count   = hannota (1,a,b,c) + count     count   = hannota(n-1,b,a,c) + count    return countprint("最少移动次数:",lastcount = hannota(10,a,b,c))

体会是:榆木语言实现汉诺塔要比python精简点,特别是python要定义a,b,c三个无用但必要的参数,C++也一样,可能这就是函数式编程与面向对象式编程的不同。