递归函数

  • 函数内部直接或间接的调用函数自身
  • 将复杂问题简单化

例子程序

  • def sum_digits(n):
    """Return the sum of the digits of positive integer n."""
    if n < 10:
    return n
    else:
    all_but_last, last = n // 10, n % 10
    return sum_digits(all_but_last) + last
  • 各位数字之和问题分解为两个步骤
    • 除了最后一个数字以外所有数字相加
    • 然后加上最后一个数字

相互递归

  • def is_even(n):
    if n == 0:
    reutrn True
    else:
    return is_odd(n-1) def is_odd(n):
    if n == 0:
    return False
    else:
    return is_even(n-1) result = is_even(4)
  • game
  • 一个双人游戏,桌上有n个鹅卵石,每次一个人能从桌子上拿走一个或两个鹅卵石,拿走最后一个鹅卵石的人胜利
    • Alice每次只拿走一个鹅卵石
    • Tom在鹅卵石是偶数的时候拿走两个鹅卵石,反之拿走一个鹅卵石
    • 最终谁会获胜
  • def play_Alice(n):
    if n == 0:
    print("Tom wins!")
    else:
    play_Tom(n-1) def play_Tom(n):
    if n == 0:
    print("Alice wins!")
    elif(n%2 == 0):
    play_Alice(n-2)
    else:
    play_Alice(n-1)

树递归

  • 一个函数调用自己大于一次
  • 例子(斐波那契数列):
    • def Fibo(n):
      if n == 1:
      return 0
      if n == 2:
      return 1
      if n > 2:
      return Fibo(n-2) + Fibo(n-1)
      def count_partitions(n, m):
      """Count the ways to partition n using parts up to m."""
      if n == 0:
      return 1
      elif n < 0:
      return 0
      elif m == 0:
      return 0
      else:
      return count_partitions(n-m, m) + count_partitions(n, m-1)
    • 不断将函数以m为界分段,直到全部分为1

SICP-1.7-递归函数的更多相关文章

  1. SICP 习题 (1.9) 解题总结

    SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使 ...

  2. [SICP] 求值规则

    在Java语言学习中,通常不太关注求值规则. (2+4*6)*(3+5+7)这样的组合式的求值规则.通常归结为优先级问题: if.for等的求值规则通常归结为语义. 函数式编程语言的Scheme,将这 ...

  3. Lisp和SICP

         大概不少programmer都看过<黑客与画家>,作者用了整整一章的篇幅讨论Lisp的强大.我自然就会手痒痒.      几个月前,几天内攻城略地搞定了Python,用的方法便是 ...

  4. javascript中的递归函数

    正常的递归函数如下: function factorial(num){ ){ ; }else{ ); } } 这个函数表面看起来还ok,但如果我们执行下面代码就会出错. var jenny = fac ...

  5. JS函数相关及递归函数的使用

    JS函数相关及递归函数的使用 通用js程序: function 函数名(参数列表) { 函数体 } 可使用alert()输出,也可用return返回值. alert与return区别: functio ...

  6. python3--函数(函数,全局变量和局部变量,递归函数)

    1.1函数 1.1.1什么是函数 函数就是程序实现模块化的基本单元,一般实现某一功能的集合.函数名:就相当于是程序代码集合的名称参数:就是函数运算时需要参与运算的值被称作为参数函数体:程序的某个功能, ...

  7. Python之路 day3 递归函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 在函数内部,可以调用其他函数.如果一个函数在内 ...

  8. Python3学习(二)-递归函数、高级特性、切片

    ##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...

  9. 浅谈-js递归函数

    所谓的递归函数就是在函数体内调用本函数.使用递归函数一定要注意,处理不当就会进入死循环.递归函数只有在特定的情况下使用 ,比如阶乘问题 下面我们就做一个10以内的阶乘试试看吧: [Ctrl+A 全选 ...

  10. Codevs 1910递归函数

    1910 递归函数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 对于一个递归函数w(a, b, c). 如果a <= ...

随机推荐

  1. linux上安装tcl

    1. 首先下载安装包,推荐下载activetcl(对tcl源码进行了预编译,安装步骤简单).打开网址http://activestate.com找到activetcl的社区版(社区版是免费的,找到li ...

  2. UGUI ScrollRect 性能优化

    测试环境 操作系统:Windows8.1 开发工具:Unity5.5.2 1.问题描述,在实际开发过程中经常会使用ScrollRect实现滚动列表,当初次加载数据比较多的情形时,Unity3D会出现比 ...

  3. 前端工程之node基础

    Node.exe是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Nodejs定义了一个构造函数 Module,所有的模块(Node中一个文件即一个模块)都是 Module 的 ...

  4. Ultimus BPM 通信和运营商行业应用解决方案

    Ultimus BPM 通信和运营商行业应用解决方案 行业应用需求 电信运营商的主要职能是维护庞大的通信网络和向电信用户提供固话通讯.手机通讯.数据通讯及相关的附加增值服务,其组织特点是工种多.分工细 ...

  5. 开涛spring3(9.3) - Spring的事务 之 9.3 编程式事务

    9.3  编程式事务 9.3.1  编程式事务概述 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理. Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是 ...

  6. OpenStack(企业私有云)万里长征第二步——使用Fuel部署

    一.前言 最近一直在使用DevStack来安装OpenStack,注意一直二字,部署了一遍又一遍,操作系统怕是安装了不下上百次,有时是为了验证新的方案,有时是安装出错,还有时是运行过程中出错.总之是碰 ...

  7. Updates were rejected because the remote contains work that you do

    每次建立新的仓库,提交的时总会出现这样的错误,真是头疼,...... 直接开始正题,git 提交的步骤: 1. git init //初始化仓库 2. git add .(文件name) //添加文件 ...

  8. javascript基础-性能优化

    优化点 性能检测 基调网络 http://www.cesule.com/cesule/status/show/3496d91653a14743af2bd2e261aee204 阿里测 http://a ...

  9. poj3207

    poj3207 题意 平面上,一个圆,圆的边上按顺时针放着n个点.现在要连m条边, 比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接. 给你的信息中,每个点最多只会连接的一条边.问能不能 ...

  10. Sizzle 源码分析 (二)

    在Sizzle函数中,如果能快速处理或者通过querySelector处理,那么就使用它处理.否则使用select函数处理 . select函数 select = Sizzle.select = fu ...