递归函数

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

例子程序

  • 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. URL Scheme与openURL

    URL Schemes URL Schemes是苹果给出的用来跳转到系统应用或者跳转到别人的应用的一种机制.同时还可以在应用之间传数据. 设置一个URL Schemes:选中App工程->Inf ...

  2. 思考一个关于Lambda表达式做为linq条件的问题

    有一个集合如下 List<User> users = new List<User> { new User{Name = "1",Aget = 12}, ne ...

  3. .net数据统计系统设计(中小型)

    近一年多没在博客园写东西了,从换公司后就一直努力学习公司的框架和业务.而今接手一个电商数据统计项目,在博客园搜索统计项目解决方案却一无所获,最终自己设计并在开发的过程中持续更新,希望可以和大家一起交流 ...

  4. Unite'17 Shanghai再一次问候

    Unite'17 Shanghai再一次问候 --暨Unity2017年度大会 2017年5月11日,主题为"再一次问候"的Unity年度盛会在上海国际会议中心举行,这是Unity ...

  5. python 基本模块

    time & datetime模块 import timeimport datetime# ## # print("ss")# #time.sleep(5)# # prin ...

  6. python selenium 元素定位(三)

    上两篇的博文中介绍了python selenium的环境搭建和编写的第一个自动化测试脚本,从第二篇的例子中看出来再做UI级别的自动化测试的时候,有一个至关重要的因素,那就是元素的定位,只有从页面上找到 ...

  7. 【小错误】WPF代码报错:未将对象引用设置到对象的实例。

    今天编写动态创建Image对象的代码时候,报出了下面的错误: 起初还以为我创建的BitmapImage对象出现了问题,设置断点调试了下代码发现BitmapImage里面是有数据的. 我就郁闷了,后来发 ...

  8. JDFS:一款分布式文件管理实用程序第一篇(线程池、epoll、上传、下载)

    一 前言 截止目前,笔者在博客园上面已经发表了3篇关于网络下载的文章,这三篇博客实现了基于socket的http多线程远程断点下载实用程序.笔者打算在此基础上开发出一款分布式文件管理实用程序,截止目前 ...

  9. python 列表、元组、字符串、字典、集合、return等梳理

    有必要对这些数据类型及操作做下梳理: 1.列表:增删改查 a.查找: >>> names=["zhang","wang","li&q ...

  10. 关于微信分享JSSDK使用需注意的几点问题

    微信公众平台技术文档中有微信JS-SDK说明文档,详情见地址https://mp.weixin.qq.com/wiki 官方给出了使用步骤和DEMO,下面说一下几点需要注意的问题. 1.登录微信公众平 ...