飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5551|回复: 9

[C/C++] 无局部变量递归的实现设计

[复制链接]

该用户从未签到

发表于 2010-12-17 11:08:55 | 显示全部楼层 |阅读模式
#include "stdio.h"

int * p = 0;
int * pp = 0;

/* 假设该参数通过寄存器传入 */

int add(int * p)
{                        
        printf("p = %X *p = %d \n",p,*p);
        getchar();
                                
        if( *p == 0 )
        {
                return 0;
        }
        else
        {
                pp = (int *)malloc(2);
                * pp = *p - 1;
                return *p + add(pp);
        }
}

main()
{
        p = (int *)malloc(2);
        *p = 10;
        printf("sum = %d ",add(p));               
}
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2010-12-17 11:16:35 | 显示全部楼层
原本是打算写成这样的

#include "stdio.h"

int i = 0;

int add(int a)
{

        i = a ;

        printf("i = %d \n", i);
        getchar();
                               
        if( i == 0 )
        {
                return i;
        }
        else
        {
                return i + add(i-1);
        }
}

main()
{
        printf("sum = %d ",add(10));               
}

C:\tc>test
i = 10

i = 9

i = 8

i = 7

i = 6

i = 5

i = 4

i = 3

i = 2

i = 1

i = 0

sum = 0


申请一个空间 解决不了该模块化设计的问题
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2010-12-17 11:29:41 | 显示全部楼层
有基础的可以尝试一下
说明:
1. 用递归实现求 1 ~ 10 的和  
2. 递归函数原型 void add(){}
3. 递归函数内不可以使用局部变量

设计一种 解决递归函数 模块化编译时 传参和返回的情况


#include "stdio.h"

int * p = 0;
int * newp = 0;
int sum = 0;

void add()
{                        
        p = newp;

        printf("p = %4X *p = %d newp = %4X *newp = %d \n",p,*p,newp,*newp);
        getchar();
                                
        if( *p == 0 )
        {
                return;
        }
        else
        {
                sum += *p ;
               
                newp = (int *)malloc(2);
                * newp = *p - 1;
                add();
        }
}

main()
{
        newp = (int *)malloc(2);
        *newp = 10;
        add();
        printf("sum = %d ",sum);               
}
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2010-12-17 13:10:49 | 显示全部楼层
说明:
1. 用递归实现求汉诺塔的步骤  
2. 递归函数原型 void move(){}
3. 递归函数内不可以使用局部变量


void move(int n,char a,char b,char c)
{
        if(n == 1)
        {
                printf("mov %c to %c \n",a,c);
                return;
        }
        move(n-1,a,c,b);
        printf("mov %c to %c \n",a,c);
        move(n-1,b,a,c);
}

void main()
{
        move(3,'a','b','c');
}
PYG19周年生日快乐!

该用户从未签到

发表于 2010-12-17 18:53:38 | 显示全部楼层
用全局变量实现汉诺塔。以n=4为例。用数组来保存函数调用过程中的参数(模拟堆栈作用,只能说是作用上)。代码很恶心/:017
程序缺陷:数组是定长的,如果n过大会产生错误!改进方法,可以用链表代替数组。。。
QQ群ID 初空如风

#include "stdio.h"
int n=4;
char a[240]={'a','b','c',4};/*模拟堆栈,保存参数。这个240是随意定的,自己没去计算具体n=4时,需要多大的空间来存参数*/
int i=0;/*模拟sp的效果,虽然很不像- -*/
void move()
{
        if(n == 1)
        {
                printf("mov %c to %c \n",a[i],a[i+2]);
                return;
        }
                n--;
                i+=4;
                a[i]=a[i-4];a[i+1]=a[i-4+2];a[i+2]=a[i-4+1];a[i+3]=(char)n;/*模拟向栈中压入4个参数*/
        move();        
                i-=4;/*模拟平衡栈*/
                n=(int)a[i+3];
        printf("mov %c to %c \n",a[i],a[i+2]);
                n--;
                i+=4;
                a[i]=a[i-4+1];a[i+1]=a[i-4];a[i+2]=a[i-4+2];a[i+3]=(char)n;
        move();
        i-=4;
                n=(int)a[i+3];

}
int main()
{
  move();
}
PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2017-1-19 11:18
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2010-12-17 21:22:09 | 显示全部楼层
    函数没有形参的情况下,利用指针传参,是最好的方法。N大的好思想学习了
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-5-31 13:17
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2010-12-18 12:27:41 | 显示全部楼层
    :dizzy:交流的这么少的啊
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-12-19 10:15:28 | 显示全部楼层
    1-10的和汇编递归:
    assume cs:code,ds:data
    data segment
            dw 0,0,0,0,0  ;申请全局变量空间 n[0] 和结果保存空间num[8]
    data ends
    code segment
    start:        mov ax,data
            mov ds,ax
           
            mov ax,10
            mov ds:[bx],ax  ;n初始化
            xor ax,ax
            mov ds:[bx+8],ax ;num初始化
           
            mov bx,0         变址初始化       
            call recu
                   
            mov ax,4c00h
            int 21h
    recu:       
            mov  dx,ds:[bx]
            mov  ax,ds:[bx+8]    ;读取所需数据n->dx,num->ax
           
            cmp dx,0
            jz  return           ;当递归n=0时返回
            add ax,dx            ;num+=n
            dec dx               ;n--
            mov ds:[bx],dx       ;n值放回原来空间  
            mov ds:[bx+8],ax     ;num值放回原来空间
           
            call recu            ;递归调用
    return:        ret
    code ends
    end start
    ,不知道对否!
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-12-19 10:56:11 | 显示全部楼层
    多多学习
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-12-23 09:15:49 | 显示全部楼层
    支持一下!!!!!!!!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表